2012-06-29 54 views
11

我想一個公共靜態函數中使用PHP函數從像這樣(我已經縮短事情有點):無法訪問自己::當無級範圍活躍

class MyClass { 

public static function first_function() { 

    function inside_this() {  
      $some_var = self::second_function(); // doesnt work inside this function 
    }    

    // other code here... 

} // End first_function 

protected static function second_function() { 

    // do stuff 

} // End second_function 

} // End class PayPalDimesale 

這時候,我得到錯誤「無法訪問self ::當沒有類作用域是活躍的」。

如果我打電話second_functioninside_this功能,它工作正常:

class MyClass { 

public static function first_function() { 

    function inside_this() {  
      // some stuff here 
    }    

    $some_var = self::second_function(); // this works 

} // End first_function 

protected static function second_function() { 

    // do stuff 

} // End second_function 

} // End class PayPalDimesale 

什麼我需要做的是能夠使用second_functioninside_this函數內?

+0

你嘗試過關閉嗎? '功能inside_this()使用($個體經營){' – bfavaretto

+0

剛試過它 - 沒有工作:( – JROB

+0

我意識到太晚了'self'不是一個變量... – bfavaretto

回答

12

這是因爲PHP中的所有函數都具有全局範圍 - 即使它們是在內部定義的,它們也可以在函數外調用,反之亦然。

所以你要做的:

function inside_this() {  
    $some_var = MyClass::second_function(); 
}  
+1

我得到'呼籲保護method'錯誤 – JROB

+2

@JohnRobinson這是因爲該方法是受保護的。 – xdazz

+0

@xdazz,反正是有拯救* MyClass的*成一個變量,並傳遞給函數而不是硬編碼的類名'MyClass'到代碼?(否則如果我們改名字之類的,我們需要查找和替換「MyClass的」整個文件) – Pacerier

3

與PHP 5.4工程:

<?php 
class A 
{ 
    public static function f() 
    { 
    $inner = function() 
    { 
     self::g(); 
    }; 

    $inner(); 
    } 

    private static function g() 
    { 
    echo "g\n"; 
    } 
} 

A::f(); 

輸出:

g 
+0

他是'protected',不'private'。 –

+0

@Cole約翰遜,私屬*以上*的限制,這就是爲什麼我在我的例子中使用它。 – Matthew

+3

@Matthew是否有這是爲什麼沒有在5.3版本的PHP工作的任何文件,並且它是工作在 –

0

試着改變你的第一個功能

public static function first_function() { 

    $function = function() {  
      $some_var = self::second_function(); // now will work 
    };    
    ///To call the function do this 
    $function(); 
    // other code here... 

} // End first_function