2011-06-21 123 views
3

是否可以向函數添加方法?PHP向函數添加方法

例如:

<? 
function func(){ 
    ; 
} 
//add method 
func->test = function(){ 
    ; 
} 

func->test(); 
func(); 

我是從一個JavaScript背景的,因此,我已經習慣了「一切都是對象」。

編輯:

我只是解釋其中的誤解往往來自新phpers。我明白上面的代碼不起作用。

EDIT 2

想通了。

class myfunc_class{ 
    function __invoke(){ 
      //function body 
    } 
    function __call($closure, $args) 
    { 
     call_user_func_array($this->$closure, $args); 
    } 
} 
$func = new myfunc_class; 

$func->test = function(){ 
    echo '<br>test<br>'; 
}; 

$func->test(); 
$func(); 

即使性感:)

class func{ 
    public $_function; 
    function __invoke(){ 
     return call_user_func_array($this->_function,func_get_args()); 
    } 
    function __construct($fun){ 
     $this->_function = $fun; 
    } 
    function __call($closure, $args) 
    { 
     call_user_func_array($this->$closure, $args); 
    } 
} 
$func = new func(function($value){ 
    echo $value; 
}); 

$func->method = function(){ 
    echo '<br>test<br>'; 
}; 

$func('someValue'); 
$func->method(); 
+1

簡單的回答:沒有。 –

+0

並非所有的讀者都能夠處理某種程度的抽象和示例性的描述。不過,我發現你的問題很好理解。 – hakre

+0

JavaScript的對象處理是基於原型的。這與幾乎所有其他流行的編程語言都不同。如果JavaScript是唯一你知道的語言,那麼我很抱歉,但你有一些不懂的做法。 – staticsan

回答

1

沒有,因爲對象是不同的PHP語言構造比的函數。函數沒有屬性,而只是執行指令。

但是,如果func人,而不是一個預先定義的類,然後是......帶着幾分巫術的,無視輿論譁然,前述可讀性和PHP編碼標準,並通過使用closures__call() magic method ...

因爲你會覺得沒有 __call()
class func 
{ 

    function __call($func, $args) 
    { 
     return call_user_func_array($this->$func, $args); 
    } 

} 


$obj = new func; 

$obj->test = function($param1, $param2) 
{ 
    return $param1 + $param2; 
}; 

echo $obj->test(1,1); 

這是行不通的,因爲$obj->test(1,1),PHP認爲你試圖調用func一個不存在的方法時出對象範圍。但在裏面,因爲新的"test"屬性是一個類型:閉包,call_user_func_array()只是將"test"屬性看作是另一個函數,所以你可以從外部範圍隱藏這一小伎倆。

+0

我最終重構了你的代碼,以獲得我正在尋找的東西。隨時檢查我的編輯。謝謝。 – William

+0

@Lime:聲明:不要在此引用我的意見,但我相信IDE可能無法用於關閉工作。此外,這使得代碼可讀性和調試成爲一場噩夢,特別是如果你不是唯一開發這個庫的人。但如果這不是問題,那麼沒有什麼可擔心的。 –

+0

它爲什麼會調試一個問題?阿洛斯,如果你不應該使用'__invoke'爲什麼它在PHP中不斷得到支持? – William

0

你會需要你的函數func()返回一個對象,那麼你可以這樣做:func()->test();

但請注意,您的處理對象的方式在PHP中是不正確的,我建議你閱讀OO文檔here

+0

你是什麼意思'不正確'。我只是想避免污染全球名稱空間。 – William

+0

@Lime在PHP中,您的代碼在加載之前需要知道對象(類)的結構,因此您需要「污染」命名空間。如果你使用PHP 5.3,你可以做什麼,如果你是一個乾淨的怪物,就使用自定義命名空間。 – Manhim

3

編號

並非所有東西都是PHP中的對象。實際上,唯一一件物體就是物體。更具體地說,並且通常是類的實例化。

您的代碼轉換爲PHP

// function_object.php 
<?php 

class FunctionObject { 

    public method func() { 
     // do stuff 

    } 

} 

?> 

在其他的代碼,你會使用這樣的:

<?php 

// example.php in same folder as function_object.php 
include 'function_object.php'; 

$FuncObj = new FunctionObject; 
$FuncObj->func(); 

另外:read more about PHP & OOP

+0

有沒有辦法定義一個包含實例化類的常量? – William

+0

@Lime我還沒有嘗試過,但我幾乎願意說'地獄不'。我也願意打賭,常量必須只有標量值(通常你會看到'strings'或'integers') – cspray

+0

@Lime:否。請參閱我的答案中的手冊鏈接它引用了該語言的所有基本部分含。常量。 – hakre

0

在差異javacript,在PHP不是一切都一個東西。因此你需要區分功能和類別。

如果你想創建一個對象,你需要這個類首先定義

class myClass { 
} 

然後,您可以根據需要添加儘可能多的功能。但是,你需要首先定義他們:

class myClass { 
    function test() { 
    echo "test!\n"; 
    } 
} 

當一切準備就緒,你可以把它帶到生活,那麼:

$class = new myClass; 
$class->test(); 

Checkout the manual for more

0

你不能做你想做的事,但你可以在其他函數中定義函數。

此示例輸出文本:

function a() { 
    function b() { echo 'Hi'; } 
} 
a(); 
b(); 
Output: HiHi 

此示例將輸出一個錯誤:

function a() { 
    function b() { echo 'Hi'; } 
} 
b(); 
Output: ERROR 
+0

你需要在聲明它後才能在b()中調用b()。此外,如果你調用()它應該定義b(),所以你可以做一個(); b();但不是b(); a(); 。 – Manhim