public function __get($name) {
if (method_exists($this, 'get'.$name)) {
$method = 'get' . $name;
return $this->$method();
} else {
throw new OutOfBoundsException('Member is not gettable');
}
}
However what's wrong with using __get and __set that act as dynamic proxies to getName() and setName($val) respectively? Something like:
public function __get($name) {
if (method_exists($this, 'get'.$name)) {
$method = 'get' . $name;
return $this->$method();
} else {
throw new OutOfBoundsException('Member is not gettable');
}
}
That way you're not stuffing everything into one monster method, but you still can use $foo->bar = 'baz'; syntax with private/protected member variables...
Or implement the necessary getter and setter methods on the class itself.
In response to the language features issue that you raised, I'd say that having a dynamically typed language differ from a statically typed one is expected. Every programming language that has OOP implements it somewhat differently: Object-Oriented Languages: A Comparison.
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;
}
}
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;
}
}
发布评论
评论(4)
没有。
但是,使用
__get
和__set
充当getName()
和setName($val)
的动态代理有什么问题> 分别?就像这样:这样你就不会将所有内容都填充到一个怪物方法中,但你仍然可以使用
$foo->bar = 'baz';
语法与私有/受保护的成员变量......Nope.
However what's wrong with using
__get
and__set
that act as dynamic proxies togetName()
andsetName($val)
respectively? Something like:That way you're not stuffing everything into one monster method, but you still can use
$foo->bar = 'baz';
syntax with private/protected member variables...我知道这对亨德拉来说为时已晚,但我相信这对其他人会有帮助。
在 PHP 核心中,我们有一个名为 ReflectionClass 的类,它可以操作对象范围内的所有内容,包括属性和方法的可见性。
在我看来,它是 PHP 有史以来最好的课程之一。
让我举一个例子:
如果你有一个带有私有属性的对象,并且你想从外部修改它,
你可以使用方法八来做同样的事情;
我希望我能帮忙;
I know it's too late for Hendra but i'm sure it will be helpfull for many others.
In PHP core we have a class named ReflectionClass wich can manipulate everything in an object scope including visibility of properties and methods.
It is in my opinion one of the best classes ever in PHP.
Let me show an example:
If you have an object with a private property and u want to modify it from outside
This same thing you can do with methods eighter;
I hope i could help;
如果使用神奇属性似乎不正确,正如其他海报已经指出的那样,您还可以考虑 ReflectionClass::getProperty 和 ReflectionProperty::setAccessible 。
或者在类本身上实现必要的 getter 和 setter 方法。
针对您提出的语言功能问题,我想说动态类型语言与静态类型语言不同是预料之中的。每种具有 OOP 的编程语言的实现方式都略有不同:面向对象语言:比较。
If using magical properties doesn't seem right then, as already pointed out by other posters, you can also consider ReflectionClass::getProperty and ReflectionProperty::setAccessible.
Or implement the necessary getter and setter methods on the class itself.
In response to the language features issue that you raised, I'd say that having a dynamically typed language differ from a statically typed one is expected. Every programming language that has OOP implements it somewhat differently: Object-Oriented Languages: A Comparison.