Создание класса с методами внутри класса?
Я хотел бы создать свойство, которое само по себе является классом, и добавить к нему другие методы в пределах "родительского" класса. MyName
, чтобы я мог сделать что-то вроде
$myname = new MyName();
$myname->event->post($params);
Я пробовал следующее, но это не работает:
class MyName {
public function __construct() {
$this->event = new stdClass();
$this->event->post = function($params) {
print_r($params);
};
}
}
$x = new MyName();
$x->event->post(array(1, 2, 3));
Который просто заканчивает тем, что отмечал следующую фатальную ошибку:
Fatal error: Call to undefined method stdClass::post() in C:\xampp\htdocs\Arkway\recreation\primepromotions\api\classes\FacebookWrapper.php on line 25
3 ответа
Вы могли бы использовать __call
чтобы получить доступ к внутреннему массиву замыканий, возможно, что-то вроде этого:
class MyName {
public function __construct() {
$this->event = new EventObj();
$this->event->post = function($params) {
print_r($params);
};
}
}
class EventObj {
private $events = array();
public function __set($key, $val) {
$this->events[$key] = $val;
}
public function __call($func, $params) {
if (isset($this->events[$func])) {
call_user_func_array($this->events[$func], $params);
}
}
}
$x = new MyName();
$x->event->post(array(1, 2, 3));
Выход:
Array
(
[0] => 1
[1] => 2
[2] => 3
)
Вы не можете сделать это в PHP.
Вы можете либо создать другой класс, а затем инициализировать его в главном классе и получить к нему доступ через переменную, либо вы можете смоделировать цепочку методов, если хотите сохранить весь код внутри одного объекта. В этой статье http://www.talkphp.com/advanced-php-programming/1163-php5-method-chaining.html показан один из способов объединения методов в PHP.
Вы можете сделать это так:
class MyName extends stdClass{
или же
class MyName {
public function getStdClass(){
return new StdClass();
}
И вы можете позвонить:
$test = new MyName();
$test->someStdClassMethod();
или же
$test = new MyName();
$test2 = $test->getStdClass();
$test2->someStdClassMethod();
Соответствующий.