2015-03-18 2 views
2

Друг и я уже некоторое время спорили о скайпе, когда полезные методы, такие как __get, полезны.Когда использовать магические методы в PHP?

Например, говорят, что у вас есть открытый/закрытый массив:

class test { 
    private $array = ['test' => 'blah']; 

    public function __get($name) { 
     return $this->array[$name]; 
    } 
} 

это правильное применение магических методов? Мы спорим, потому что на странице php.net для магических методов он говорит «недоступные члены/свойства». Я полагаю, что это означает переменные private, и хотя он может использоваться для массива элементов внутри массивов без прямого доступа к массиву, что не предназначено для использования.

+0

у вас есть продвижение? –

ответ

0

Вам нужно всего лишь использовать магию, если объект действительно «волшебный». Если у вас есть классический объект с фиксированными свойствами, то используйте сеттеры и геттеры, они работают нормально.

Если ваш объект имеет динамические свойства, например, он является частью уровня абстракции базы данных, а его параметры заданы во время выполнения, тогда вам действительно нужны магические методы для удобства.

Смотрите этот пример с методами MAGICS __set и __get:

<?php 
class PropertyTest 
{ 
    private $a, $b; 

    public function __set($name, $value) 
    { 
     echo "Set '$name' to '$value'\n"; 
     $this->$name = $value; 
    } 
    public function __get($name) 
    { 
     echo "Get $name \n"; 
     return $this->$name; 
    } 
} 
echo "<pre>\n"; 
$obj = new PropertyTest; 
$obj->a = 1; 
echo $obj->a . "\n\n"; 

echo "<pre>\n"; 
$obj = new PropertyTest; 
$obj->b = "Hello"; 
echo $obj->b . "\n\n"; 

?> 

Вы можете прочитать по адресу:

Edit с другими, например, используя магический метод __call :

<?php 
class Called { 
    private $Id, $Name; 

    public function __call($name, $arguments) { 
     $action = substr($name, 0, 3); 
     $field = substr($name, 3); 

     if($action == 'set') { 
      $this->$field = $arguments[0]; 
     }  

     if($action == 'get') { 
      return $this->$field; 
     }  
    } 
} 

$obj = new Called(); 
$obj->setId(4); 
echo "<br/>\n"; 
echo $obj->getId(); 

echo "<br/>\n"; 

$obj->setName('Peter'); 
echo "<br/>\n"; 
echo $obj->getName(); 

?> 

вы можете прочитать по адресу:

Reference:

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