JavaScript风格的PHP包装


JavaScript style wrapping in PHP

我主要是一个JS开发人员,使用PHP的服务器端踢我想看看是否有一个方法在PHP类似于JS:

var something = {
    action1: function() { alert('Fire 1!'); },
    action2: function() { alert('Fire 2!'); },
    action3: function() { alert('Fire 3!'); }
}

然后允许我调用:

something.action2();  // Alerts 'Fire 2!'

这是一个相对较小的应用程序,我正在工作,我想避免构建类。由于PHP是如此小的一部分,我希望尽可能保持代码风格相似。

使用关联数组和匿名函数(必须至少有PHP 5.3)将为您工作:

$arr = array(
    'action1' => function() { echo "Fire 1'n"; },
    'action2' => function() { echo "Fire 2'n"; },
    'action3' => function() { echo "Fire 3'n"; }
);
$arr['action1'](); // Fire 1

请记住,使用$this (JavaScript中的this)将无法从函数中访问其他函数或数组项。

如果你能给我们更多关于你想做什么的细节,我们可以举一些更好的例子。

PHP没有JavaScript那样的对象形式,因为PHP是一种基于类的语言,而JavaScript是一种基于原型的语言。这实际上意味着PHP通过实例化类来创建对象。然而,JavaScript有对象,然后克隆创建新对象。

如果你想让你的代码易于理解,我建议使用PHP类:

class SomeClass {
    function alert($string) {
        // Do something
    }
    function action1() {
        $this->alert('Fire 1!');
    }
    function action2() {
        $this->alert('Fire 2!');
    }
    function action3() {
        $this->alert('Fire 3!');
    }
}
$something = new SomeClass();
$something->action2(); // Runs the action2 function of your object

或者是静态类?

<?php
class something {
    public static function action1 () {
        echo 'Fire 1';
    }
    public static function action2 () {
        echo 'Fire 2';
    }
    public static function action3 () {
        echo 'Fire 3';
    }
}
something::action1();
something::action2();
something::action3();

这就可以了(假设你想创建3个这样的警报:p)。

<?php
//Array of Functions
$a = array
(
    'action1' => function() { echo "<script>alert('Fire 1!');</script>"; },
    'action2' => function() { echo "<script>alert('Fire 2!');</script>"; },
    'action3' => function() { echo "<script>alert('Fire 3!');</script>"; }
);
$a['action1'](); // Fire 1
$a['action2'](); // Fire 2
$a['action3'](); // Fire 3
?>

对Tim Cooper回答的修改

$o = (object) array(
    'action1' => function() { echo "Fire 1'n"; },
    'action2' => function() { echo "Fire 2'n"; },
    'action3' => function() { echo "Fire 3'n"; }
);
$o->action2();