2015-06-10 4 views
0

Я хочу создать конструктор демона в PHP.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() { 

    } 
} 

В дополнение к пропусканием $ хоста и $ порта параметры, как

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

Я хочу, чтобы как-то передать функцию цикла() в качестве 3-го параметра, поэтому он переписывает петлю() или вводить внутри него код.

Я попытался

$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(); 

Ни работы. Как мне это сделать? Я изо всех сил пытался найти решение.

ответ

1

Вы можете вызвать конструкцию языка 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 типа ..

+0

$ Сервер = новый DEMON ("127.0.0.1", 1337, функция() использования ($ сервер) { \t echo $ server-> host; }); throws error – marirena

+0

Попытка получить свойство не объекта – marirena

0

Я не уверен по вашим фактическим причинам, позволяя функции запускать произвольный код, но вы можете сделать что-то действительно грязное, выполнив 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); 
    } 
} 
2

Вы можете просто передать анонимную функцию конструктора

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(); 
+0

Этот обратный вызов «$ callback = $ this->»; был эпическим. 100x спасибо – marirena

+0

рад я мог помочь – c4pone

+0

Это, по сути, то, что я писал/тестировал. Я бы добавил, однако, что вы не сможете получить доступ к '$ host' и другим приватным свойствам на' $ server' внутри вашего обратного вызова. Вы должны сделать их общедоступными, добавить метод getter или передать их в виде отдельных аргументов. –

Смежные вопросы