Автоматизированные функции получения / установки - PullRequest
3 голосов
/ 02 ноября 2011

Я смотрю документацию Doctrine 2 и Symfony для создания класса модели. Есть несколько фрагментов кода, где в классе используются getProperty и setProperty, и они каким-то образом используются автоматически, когда значение присваивается непосредственно свойству , Это отличается от типичных магических методов get / set, и пример кода, с которым я столкнулся, не реализует никаких пользовательских магических методов, поэтому я считаю, что это где-то обрабатывается Doctrine.

Из того, что я прочитал, Doctrine реализует методы доступа и мутаторы. Возможно, я пропустил пакет при загрузке Pear, или, может быть, я не включил что-то в свой скрипт.

Например:

class User {

    public $name;
    public function getName()
    {
        // Do stuff
    }
}

$user = new User();
$foo = $user->name; // getName is called

Примечание: я ищу конкретное решение для Доктрины. Я знаю, что это можно каким-то образом сделать с помощью PHP, но я хочу использовать нативные функции Doctrine.

Редактировать: Обновлено, чтобы прояснить, чем это отличается от типичных магических методов get / set, и примечание.

Ответы [ 2 ]

6 голосов
/ 02 ноября 2011
class User {
    private $name;
    public function __get($property) {
        $methodName = "get".ucfirst($property);
        if (method_exists($this, $methodName)) {
           return call_user_func(array($this, $methodName));
        } elseif (isset($this->{$property})) {
            return $this->{$property};
        }
        return null;
    }
    public function __set($property, $value) {
        $methodName = "set".ucfirst($property);
        if (method_exists($this, $methodName)) {
            call_user_func_array(array($this,$methodName), array($value));
        } else {
            $this->{$property} = $value;
        }
    }
    public function getName() {
        return "My name is ".$this->name;
    }
}

$user = new User();
$user->name = "Foo";
$bar = $user->name;
echo $bar; // "My name is Foo"

Если есть метод getSomething или setSomething, он будет вызываться при непосредственном доступе к свойствам.

Как я читал на этой странице документации , этоименно то, что код выше делает то, что делает Doctrine.Но он вызывает метод _set('fieldName', 'value').

2 голосов
/ 02 ноября 2011

Если $name объявлено public, тогда эта строка кода:

$foo = $user->name;

фактически обращается к полю $name и фактически не вызывает функцию getName.

Вы можете использовать магические методы PHP __get и __set для автоматического предоставления методов доступа и мутаторов, например:

class User {
    private $name;
    public function __get($property) {
       //check first to make sure that $property exists 
       return $this->$property;
    }
    public function __set($property, $value) {
        //check first to make sure that $property exists
        $this->$property = $value;
    }
}

$user = new User();
$user->name = "Foo";
$bar = $user->name;
echo $bar; //"Foo"

Вы можете найти больше информации о магических методах PHP здесь .

ОБНОВЛЕНИЕ : Я думаю, что Doctrine делает следующее:

class User {
    private $name;
    public function __get($property) {
       $propertyTitleCase = mb_convert_case($property, MB_CASE_TITLE);
       $method = "get{$propertyTitleCase}";
       if(method_exists($this, $method))
       {
          return $this->$method();
       }
       else {
          return $this->$property;
       }
    }

    public function getName() {
        //Do Stuff
    }
}
...