2016-01-08 6 views
3

Я пытаюсь схватиться с волшебными методами PHP, и для этого я создаю тестовый класс, который выглядит следующим образом:Создание и использование магических методов в PHP

<?php 
class overload 
{ 
    protected $lastCalledParam; 

    public $param; 

    public function __construct() 
    { 
     return $this->switchConstruct(func_get_args()); 
    } 

    protected function switchConstruct(array $args) 
    { 
     switch (count($args)) 
     { 
      case 0: 
       return print "0 params<br />"; 
      case 1: 
       return call_user_func_array(array($this, 'constr1'), $args); 
      case 2: 
       return call_user_func_array(array($this, 'constr2'), $args); 
     } 
     die("Invalid number of args"); 
    } 

    protected function constr1($a) 
    { 
     print "constr1 called<br />"; 
    } 

    protected function constr2($a, $b) 
    { 
     print "constr2 called<br />"; 
    } 

    public function __get($name) 
    { 
     $this->lastCalledParam = $name; 
     return $this->{$name}; 
    } 

    public function __set($name, $value) 
    { 
     $this->lastCalledParam = $name; 
     $this->{$name} = $value; 
    } 

    protected function lastCalled() 
    { 
     if (func_num_args() == 1) 
     { 
      $args = func_get_args(); 
      $this->lastCalledParam = $args[0]; 
     } 
     return $this->lastCalledParam; 
    } 

    public function __toString() 
    { 
     return $this->lastCalledParam == null ? "No data found" : $this->lastCalledParam; 
    } 
} 

И называется так:

<?php 

require_once 'clib/overload.php'; 

$c = new overload(); 
print $c->__toString(); 
print "<br />"; 
$c->param = "Hello"; 
print $c->__toString(); 
?> 

поведение, которое я ожидал, что на первом __toString() вызова будет:

0 PARAMS
Нет данных
Здравствуйте

Но то, что я получаю:

0 PARAMS
Нет данных
Нет данных

я пришел к основным придерживаясь точки с этим и не может понять, почему он не делает работу по установке lastCalledParam собственности!

Я получаю общее количество 0 ошибок и 0 предупреждений с полным сообщением об ошибках и предупреждениях, поэтому я не понимаю, что не называется, где/почему.

+0

Этот пример можно использовать ад много похудение вниз. Половину этого кода не нужно читать, чтобы понять проблему. – deceze

+0

Метод '__set' также перезаписывает значение' lastCalledParam' с конструкцией массива. – MatsLindh

ответ

6

__set активируется только в том случае, если параметр не может быть достигнут нормально. Ваш public $param должен быть protected, по крайней мере, для __set для вызова.

__set() запускается при записи данных в недоступных свойств.

http://php.net/manual/en/language.oop5.overloading.php#object.set (курсив мой)

+0

Итак, 'protected $ param' в классе, а затем выполните' $ c -> __ set ("param", "hello") 'в тестовом файле? –

+0

'protected $ param' в классе,' $ c-> param = ..' в файле. – deceze

+0

Правильно, я сделаю это, спасибо :) –