Получить и установить (частное) свойство в 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 перегрузка?
Обновление
Почему Не Волшебный Метод?
В Интернете ходят слухи, что волшебный метод в 10 раз медленнее, чем явный метод геттер-сеттера, я его еще не тестировал, но это полезно иметь в виду. (Выяснил, что это не так медленно, просто в 2 раза медленнее, см. Результат теста ниже)
Я должен собрать все в один огромный метод, если я использую волшебный метод вместо этого разделите их на разные функции для каждого свойства, как в явном установщике геттера. (На это требование мог бы ответить ircmaxell)
Сравнительный анализ накладных расходов на производительность
Мне любопытно узнать о накладных расходах на производительность между использованием магического метода и явного метода получения, поэтому я создал свой собственный тест для обоих методов и, надеюсь, он может быть полезен любому, кто прочтет это.
С помощью магического метода и метод_существующий:
( нажмите здесь, чтобы увидеть код)
- Геттер стоит 0,0004730224609375 секунды.
- Сеттер стоит 0,00014305114746094 секунды.
С явным настройщиком геттера:
( нажмите здесь, чтобы увидеть код)
- Геттер стоит 0,00020718574523926 секунды.
- Сеттер стоит 7,9870223999023Е-5 секунд (это 0,00007ххх).
Тем не менее, оба сеттер и геттер с магическим методом и методом существует, просто стоит в 2 раза дороже, чем явный сеттер геттера. Я думаю, что по-прежнему приемлемо использовать его для систем малого и среднего масштаба.
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';
с закрытыми/защищенными переменными-членами...
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();
Это то же самое, что вы можете делайте с помощью методов восьмерки;
Я надеюсь, что смогу помочь;
Нет.
Если магия не кажется правильной, то единственный другой способ получить доступ к частным переменным - это объявить явные методы получения и установки.
Кроме того, специфические особенности ООП варьируются в зависимости от языка: Объектно-Ориентированные Языки: Сравнение.
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;
}
}