簡體   English   中英

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM