[英]How can I assign a value to public variable from inside static function in php?
[英]Assign a static function to a variable in PHP
我想為變量分配一個靜態函數,以便我可以將其作為參數發送。 例如:
class Foo{
private static function privateStaticFunction($arg1,$arg2){
//compute stuff on the args
}
public static function publicStaticFunction($foo,$bar){
//works
$var = function(){
//do stuff
};
//also works
$var = function($someArg,$someArg2){
//do stuff
};
//Fatal error: Undefined class constant 'privateStaticFunction'
$var = self::privateStaticMethod;
//same error
$var = Foo::privateStaticFunction;
//compiles, but errors when I try to run $var() somewhere else, as expected
//Fatal error: Call to private method Foo::privateStaticMethod() from context ''
$var = function(){
return Foo::privateStaticMethod();
};
}
}
我嘗試了一些其他的變化,但沒有一個工作。
我甚至不希望這種功能性的黑客攻擊與PHP一起工作但嘿,誰知道呢?
是否可以在PHP中執行此操作,還是需要使用eval
進行一些黑客攻擊?
PS:關於## php的 LawnGnome提到了一些關於可以用array('Foo','privateStaticMethod')
做什么的事情array('Foo','privateStaticMethod')
但是我不明白他的意思我沒有因為他看起來很忙而沒有按下他。
您希望將call_user_func與數組參數一起使用。
$var = array('Foo','privateStaticMethod');
call_user_func($var);
請注意,該方法上的“private”說明符將使它在Foo
類中只能以這種方式調用。
call_user_func將callable作為第一個參數。 請注意,從PHP 5.2.3開始,可以避免在您的情況下使用數組表示法。
通過傳遞類名而不是索引0處的對象,也可以傳遞靜態類方法而無需實例化該類的對象。從PHP 5.2.3開始,也可以傳遞'ClassName :: methodName'。
作為注釋,您應該將靜態變量設置為:
static $privateStaticMethod;
$var = self::$privateStaticMethod;
使用self::
時離開$
將嘗試訪問類CONSTANT而不是變量。
實際上,我認為你的意思是:
//Fatal error: Undefined class constant 'privateStaticFunction'
$var = self::privateStaticFunction("arga", "argb");
如果您使用的是PHP 5.4,則可以在publicStaticFunction
執行以下publicStaticFunction
:
$var = function(){
return self::privateStaticFunction();
};
$var();
在PHP 5.4中,PHP允許您從lambda函數訪問class scope
。
另外,你看過ReflectionClass
嗎?
以下內容將用於以更多OOP樣式替換call_user_func_array()
:
<?php
$rc = new ReflectionClass('SomeClass');
$class = $rc->newInstanceArgs(array('foo', 'bar'));
echo $class->doSomething();
您可以編寫自己的類來使用ReflectionMethod
來實現ReflectionClass
並使用setAccessible()
來允許訪問受保護的方法和私有方法。
以下是我為解決問題所做的工作
class test{
static function Unix($arr){return implode("/",$arr);}
static function Windows($arr){return implode("\\",$arr);}
function test(){
$slash = "Unix";
echo self::$slash(["path","to","a","folder"]);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.