Получить и установить (частное) свойство в PHP, как и в C#, без использования перегрузки магического метода getter setter


Краткое описание

Пример кода:

Class People {
    // private property.
    private $name;

    // other methods not shown for simplicity.
}

Прямо вперед. Позвольте мне предположить, что $name является ЧАСТНЫМ членом класса (или свойством, переменной, полем, называйте это как хотите). Есть ли какой-нибудь способ сделать это в PHP:

$someone = new People();
$someone->name = $value;
$somevar = $someone->name;

БЕЗ использования __get($name) и __set($name, $value).


Предыстория

Мне нужно было проверить назначенный $value, поэтому мне просто нужен геттер-сеттер, подобный этому:

getName();
setName($value);

И НЕ обязательно магический метод геттера-сеттера перегружается следующим образом:

__get($value); 
__set($value, $name);

Тем не менее, мне просто нужен сеттер-геттер. Но это НЕ то, чего я хочу. Это просто не похоже на объектно-ориентированный, потому что люди со статическим типизированным языком, таким как C++ или C#, могут чувствовать то же самое, что и я.

Есть ли способ получить и установить частное свойство в PHP, как в C#, без использования метода getter setter magic перегрузка?


Обновление

Почему Не Волшебный Метод?

  1. В Интернете ходят слухи, что волшебный метод в 10 раз медленнее, чем явный метод геттер-сеттера, я его еще не тестировал, но это полезно иметь в виду. (Выяснил, что это не так медленно, просто в 2 раза медленнее, см. Результат теста ниже)

  2. Я должен собрать все в один огромный метод, если я использую волшебный метод вместо этого разделите их на разные функции для каждого свойства, как в явном установщике геттера. (На это требование мог бы ответить ircmaxell)

Сравнительный анализ накладных расходов на производительность

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

С помощью магического метода и метод_существующий:

( нажмите здесь, чтобы увидеть код)

  • Геттер стоит 0,0004730224609375 секунды.
  • Сеттер стоит 0,00014305114746094 секунды.

С явным настройщиком геттера:

( нажмите здесь, чтобы увидеть код)

  • Геттер стоит 0,00020718574523926 секунды.
  • Сеттер стоит 7,9870223999023Е-5 секунд (это 0,00007ххх).

Тем не менее, оба сеттер и геттер с магическим методом и методом существует, просто стоит в 2 раза дороже, чем явный сеттер геттера. Я думаю, что по-прежнему приемлемо использовать его для систем малого и среднего масштаба.

Author: Community, 2011-02-07

4 answers

Нет.

Однако что плохого в использовании __get и __set, которые действуют как динамические прокси для getName() и setName($val) соответственно? Что-то вроде:

public function __get($name) { 
    if (method_exists($this, 'get'.$name)) { 
        $method = 'get' . $name; 
        return $this->$method(); 
    } else { 
        throw new OutOfBoundsException('Member is not gettable');
    }
}

Таким образом, вы не запихиваете все в один метод монстра, но вы все равно можете использовать синтаксис $foo->bar = 'baz'; с закрытыми/защищенными переменными-членами...

 6
Author: ircmaxell, 2011-02-07 19:18:55
ReflectionClass is your salvation

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

В ядре PHP у нас есть класс с именем ReflectionClass, который может управлять всем в области объекта, включая видимость свойств и методов.

На мой взгляд, это один из лучших классов, когда-либо существовавших в PHP.

Позвольте мне показать пример:

Если у вас есть объект с частным свойством и вы хотите изменить его извне

$reflection = new ReflectionClass($objectOfYourClass);
$prop = $reflection->getProperty("PrivatePropertyName");
$prop->setAccessible(true);
$prop->setValue($objectOfYourClass, "SOME VALUE");
$varFoo = $prop->getValue();

Это то же самое, что вы можете делайте с помощью методов восьмерки;

Я надеюсь, что смогу помочь;

 3
Author: Guilherme Ferreira, 2018-07-09 18:22:03

Нет.

Если магия не кажется правильной, то единственный другой способ получить доступ к частным переменным - это объявить явные методы получения и установки.

Кроме того, специфические особенности ООП варьируются в зависимости от языка: Объектно-Ориентированные Языки: Сравнение.

 2
Author: Saul, 2011-02-07 19:16:50
class conf_server
{

private $m_servidor="localhost";
private $m_usuario = "luis";
private $m_contrasena = "luis";
private $m_basededatos = "database";

public function getServer(){
    return $this->m_servidor;
}
public function setServer($server){
    $this->m_servidor=$server;
}
public function getUsuario(){
    return $this->m_usuario;
}
public function setUsuario($user){
    $this->m_usuario=$user;
}
public function getContrasena(){
    return $this->m_contrasena;
}
public function setContrasena($password){
    $this->m_contrasena=$password;
}
public function getBaseDatos(){
    return $this->m_basededatos;
}
public function setBaseDatos($database){
    $this->m_basededatos->$database;
}
}
 0
Author: luis, 2014-02-04 01:55:45