2014-12-16 3 views
2

В основном я использую перегрузку PHP для создания динамических методов и свойств. То, что я хочу сделать, это вызвать функцию для доступа к свойствам, но сохранить доступ к ее методам.Вызов функции при доступе к свойствам (методы магии PHP)

Другими словами, это мой PHP код:

Первый класс:

class _class { 
    private $_instance; 

    public function __construct() { 
     $this->_instance = new _object(); 
    } 

    public function __get($name) { 
     switch ($name) { 
      case "instance": 
       //LOGICS 
       break; 
     } 
     return null; 
    } 
} 

Второй класс:

class _object { 
    public function __call($method, $args) { 
     switch ($method) { 
      case "method": 
       //LOGICS 
      break; 
     } 
     return null; 
    } 
} 

Теперь я хочу, чтобы выполнить функцию, когда я доступ к объекту таким образом:

$obj = new _class(); 
echo $obj->instance; //some output here, executing a function 
echo $obj->instance->method(); //different output, executing the method of the instance 

Спасибо, помощь будет действительно оценена!

+0

И результаты? Что ты получил? Вы получили то, что хотите? или что? –

+0

Доступ к объекту работает нормально, и код достигает коммутатора, но мне не хватает части для вызова функции, если вместо '$ obj-> instance' вызывается' $ obj-> instance-> somemethod() '. – deez4h

+0

Все еще неясно для меня. Какие тесты вы выполнили, какой результат вы получаете, какова цель всего этого? –

ответ

0

Когда вы создаете экземпляр первого класса, тогда вы создаете $this->_instance вместо $obj->instance. So $obj->instance будет null и не может ничего на этом называть.

Но, если вы попробуете $obj->_instance->method();, это тоже будет плохо, потому что _instance является закрытым. Поэтому вам нужно добавить getter. Попробуйте это:

class _class { 

    private $_instance; 

    public function __construct() { 
     $this->_instance = new _object(); 
    } 

    public function __get($name) { 
     switch ($name) { 
      case "instance": 
       echo "Instance"; 
       break; 
     } 
     return null; 
    } 

    public function getInstance() { 
     return $this->_instance; 
    } 

} 

class _object { 

    public function __call($method, $args) { 
     switch ($method) { 
      case "method": 
       echo "Method"; 
       break; 
     } 
     return null; 
    } 

} 

$obj = new _class(); 
$obj->instance; 
$obj->getInstance()->method(); 

Выход:

Instance 
Method 
+0

Уже сделано таким образом, но я хочу сохранить один и тот же sintax, чтобы я мог вызвать '$ obj-> instance;' и '$ obj-> instance -> method(); 'и получить правильные результаты (так что в основном я хочу избежать метода getInstance() и найти способ его определения программно) – deez4h

+0

Но у вас нет объекта' $ obj-> instance'. Это несуществующее свойство, поэтому '__get' выполняется. У вас есть только '$ obj -> _ instance', но это личное. Вам нужно настроить его на публичный, а затем вы можете вызвать '$ obj -> _ instance-> method()', если вы хотите сделать это таким образом. – vaso123

+0

Да, я просто хотел обсудить эту идею с некоторыми другими и, возможно, найти способ создать нечто похожее на способ доступа C# Entity Framework к данным или выполнить на них методы. Установка '$ obj -> _ instance' public не соответствует моему запросу (возможно, недостижимому), чтобы сохранить одно и то же имя для доступа к экземпляру или к способу доступа к экземпляру. – deez4h