2011-08-11 41 views
16

我試圖從外部文件動態添加方法。 現在我在我的課上有__call方法,所以當我打電話給我想要的方法時,__call包含了我的方法;問題是我想通過使用我的類調用加載函數,並且我不希望在類之外加載函數;如何動態添加方法

Class myClass 
{ 
    function__call($name, $args) 
    { 
     require_once($name.".php"); 
    } 
} 

echoA.php:

function echoA() 
{ 
    echo("A"); 
} 

的話,我想用它喜歡:

$myClass = new myClass(); 
$myClass->echoA(); 

任何意見,將不勝感激。

+0

從php [手冊](http://www.php.net/manual/functions.user-defined.php):*「... PHP中的所有函數和類都具有全局範圍。 ..「*。所以至少:*「...而且我不想在課堂外加載函數; ...」*是不可能的。 – Yoshi

+0

這聽起來像個壞主意...... – deceze

+0

@Yoshi我想我沒有解釋清楚,當我包含包含該函數的文件時,它可以在任何地方調用,如:echoA();而不是$ myClass-> echoA(); –

回答

0

什麼你指的是被稱爲重載。閱讀所有關於它的PHP Manual

2

如果我閱讀本手冊的權利, 的__call得到所謂insted的功能,如果函數存在不到風度所以 你probely需要調用它,你創建之後

Class myClass 
{ 
    function __call($name, $args) 
    { 
     require_once($name.".php"); 
     $this->$name($args); 
    } 
} 
+2

您不能在執行時向php類添加方法。 – Yoshi

+0

我試了2個小時前,我們不能通過包含一個包含函數的文件添加方法,這就是爲什麼我問這個問題;) –

+0

我認爲這可能是有效的答案,除了require_once方法來調用動態函數似乎沒有辦法走。我正在使用__call魔術方法有條件地創建一個方法。 –

-3

我已經處理了下面的代碼示例和一個幫助方法,它可以與__call一起使用,這可能證明是有用的。 https://github.com/permanenttourist/helpers/tree/master/PHP/php_append_methods

+3

請注意,[鏈接只是答案](http://meta.stackoverflow.com/tags/link-only-answers/info)不鼓勵,所以答案應該是搜索解決方案的最終點(vs.而另一個引用的中途停留時間往往會隨着時間推移而過時)。請考慮在此添加獨立的摘要,並將鏈接保留爲參考。 – kleopatra

+0

鏈接處於脫機狀態。 – mheinzerling

2

您可以動態地添加屬性,並提供它是通過以同樣的方式構造函數中完成的方法,你可以將一個函數作爲另一個函數的參數。

class Example { 
    function __construct($f) 
    { 
     $this->action=$f; 
    } 
} 

function fun() { 
    echo "hello\n"; 
} 

$ex1 = new class('fun'); 

你不能打電話directlry $ex1->action(),它必須被分配給一個變量,然後你可以調用像函數這個變量。

+0

請在這裏發佈一個重要部分 – VladL

0

您可以創建在您的類屬性:methods=[]
和使用create_function爲創建lambda函數。
將其存儲在methods屬性中,位於所需方法名稱的索引處。
使用:

function __call($method, $arguments) 
{ 
    if(method_exists($this, $method)) 
     $this->$method($arguments); 
    else 
     $this->methods[$method]($arguments); 
} 

查找和調用好方法。

1

這是你需要什麼?

$methodOne = function() 
{ 
    echo "I am doing one.".PHP_EOL; 
}; 

$methodTwo = function() 
{ 
    echo "I am doing two.".PHP_EOL; 
}; 

class Composite 
{ 
    function addMethod($name, $method) 
    { 
     $this->{$name} = $method; 
    } 

    public function __call($name, $arguments) 
    { 
     return call_user_func($this->{$name}, $arguments); 
    } 
} 


$one = new Composite(); 
$one -> addMethod("method1", $methodOne); 
$one -> method1(); 
$one -> addMethod("method2", $methodTwo); 
$one -> method2();