【问题标题】:PHP | Change function inside classPHP |更改类内的功能
【发布时间】:2015-08-26 10:26:59
【问题描述】:

我想在 PHP 中创建一个守护进程构造函数。

class DAEMON {
    var host;
    var port;
    function __construct($host, $port) {
        $this -> host = $host;
        $this -> port = $port;
    }
    function start() {
        while (true) {
            $this->loop();
        }
    }
    function loop() {

    }
}

除了传递$host和$port之类的参数

$server = new DAEMON("127.0.0.1", 9000);
$server -> start();

我想以某种方式将 loop() 函数作为第三个参数传递,因此它会覆盖 loop() 函数或在其中注入代码。

我试过了

$server = new DAEMON("127.0.0.1", 9000, function() {
    // function() can't take any parameters
    // I cant use $server variable here
});
$server -> start();

$server = new DAEMON("127.0.0.1", 9000);
$server::loop = function() {
    //not working, it's not javascript
};
$server->start();

都不行。我该怎么做?我一直在努力寻找解决方案..

【问题讨论】:

    标签: php function class parameters


    【解决方案1】:

    你可以只传递一个匿名函数给构造函数

    http://php.net/manual/en/functions.anonymous.php

    <?php
    
    class DAEMON {
        private $host;
        private $port;
        private $callback;
    
        public function __construct($host, $port, $callback) {
            $this->host = $host;
            $this->port = $port;
            if ( ! is_callable($callback)) {
                throw new InvalidArgumentException('callback needs to be a function');
            }
    
            $this->callback = $callback;
        }
    
        public function start() {
            $callback = $this->callback;
            while (true) {
                $callback($this);
            }
        }
    }
    
    $server = new DAEMON("127.0.0.1", 9000, function($server) {
        echo "hello_world";
    });
    
    $server->start();
    

    【讨论】:

    • 这基本上就是我正在编写/测试的内容。不过,我要补充的一件事是,您将无法在回调中访问 $host$server 上的其他私有属性。您必须将它们公开,添加一个 getter 方法或将它们作为单独的参数传递。
    • 不,如果需要,您也可以简单地将主机和端口简单地传递给回调函数
    • 这是我建议的选项之一,“将它们作为单独的参数传入”。
    【解决方案2】:

    您可以调用use 语言结构将参数传递给匿名函数。在您的情况下,如果您想使用 $server 变量,那么您可以这样做 ..

    $server = new DAEMON("127.0.0.1", 9000, function() use ($server){
        // function() can't take any parameters
        // I cant use $server variable here
    });
    $server -> start();
    

    ...但是要使其正常工作,您的DAEMON{} 类应该在接受callable 类型的构造函数中具有第三个参数..

    【讨论】:

    • $server = new DEMON("127.0.0.1", 1337, function() use ($server){ echo $server->host; });抛出错误
    • 试图获取非对象的属性
    【解决方案3】:

    我不确定您允许函数运行任意代码的实际原因,但您可以通过执行 string as php code 来做一些非常肮脏的事情。

    class DAEMON {
        private $host;
        private $port;
        private $injection;
    
        public function __construct($host, $port, $injection) {
            $this->host = $host;
            $this->port = $port;
            $this->injection = $injection;
        }
        public function start() {
            while (true) {
                $this->loop();
            }
        }
        private function loop() {
            eval($this->injection);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-02-02
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多