2010-04-09 53 views
1

我正在嘗試學習PHP,我想知道是否有一些函數等價結構:Javascript和PHP之間的代碼等價

在JS中我可以做:

var t = function() {}; 
t(); 

myObj.DoStuff = function() {} // here I add a method at run-time 
myObj.DoStuff(); 
myObj["DoStuff"](); 

var j = myObj.DoStuff; 
j(); 

等等功能評估。

在Js對象中是關聯數組,因此每個屬性都可以使用 下標符號進行訪問...

我可以在運行時向類模板添加一個方法,以便接下來它的對象實例可以擁有它嗎?

在JS中,我可以通過原型函數屬性來實現。

回答

0

基本上,這是不可能在PHP中。有一些技巧可以讓你在某些情況下爲新對象添加功能(如使用魔術__call方法),但與JavaScript原型無關。

如果您在服務器端語言中需要類似的東西,您可能需要學習Python而不是PHP。

+0

請記住,PHP 5.3引入了完整的lambda函數,所以這確實是可能的。 – mattbasta 2010-04-09 15:25:32

+0

Lambdas不允許您將方法添加到現有對象。它們允許你創建一個內聯的匿名函數。 – RaYell 2010-04-10 13:57:30

2

這是可能的,但它是不健康的,不是一個好的做法或你想在每天的基礎上做的事情。 JavaScript和PHP的組織方式不同,您將使用PHP中的類和方法,其中JavaScript中它們是對象和函數。

這裏是你正在嘗試做的寫在5.2+那裏有沒有匿名函數是什麼一個例子:

<?php 

/* 
var t = function() {}; 
t(); 
*/ 

function _t() { 
    echo '<br>T'; 
} 

$t = '_t'; 
$t(); 

/* 
myObj.DoStuff = function() {} // here I add a method at run-time 
myObj.DoStuff(); 
myObj["DoStuff"](); 

var j = myObj.DoStuff; 
j(); 
*/ 
class myObj { 
    var $doStuff = ''; 
} 

function _DoStuff() { 
    echo '<br>Do Stuff'; 
} 

$myObj = new myObj(); 
$myObj->doStuff = '_DoStuff'; 
$j = $myObj->doStuff; 
$j(); 

?> 

在5.3+他們推出anonymouse功能,所以你甚至可以做到這一點

$t = function() { 
    echo 'T'; 
} 
$t(); 

更多關於此匿名函數 - http://php.net/manual/en/functions.anonymous.php

我建議你閱讀更多關於Variable function names其中大部分是很有幫助。

你也可以在一個Class中動態注入函數,這是你嘗試做的第二件事,但它通常不是一個好主意。一個人在這裏做了一些工作 - http://www.gen-x-design.com/archives/dynamically-add-functions-to-php-classes/

+0

爲什麼我可以通過: $ myObj = new myObj(); $ myObj-> doStuff = function(){}; $ j = $ myObj-> doStuff; $ j(); 我不能直接調用$ myObj-> doStuff();所以我不明白爲什麼如果我有一個函數返回一個數組我不能這樣做: myFunc()[2]; //它需要3°的元素... PHP是一種動態語言嗎? 可能是我期待Python ... – xdevel2000 2010-04-12 13:35:26

+0

這是它是什麼。 – 2010-04-12 14:07:18