2010-12-03 49 views
0

是否有可能覆盖我已经设置的参数的get和set方法?所以每次我设置一个参数,我都可以使用它/验证它?PHP覆盖获取设置方法

class User { 

    public $username; 

    function custom_set($name, $value) { 
     if(strlen($value) < 5) { 
     return "not long enough"; 
     } else { 
     $this->$name = $value; 
     } 

    } 
} 

$u = new User(); 
$u->username = "ted"; 
echo $u->username; 

输出:“不够长”

这是一个非常简单的例子,我只是写了,可能有错误,它只是传达什么,我试图做的。我想要调用custom_set方法。

我不想做的构造函数中的验证,我不想创造这样$u->setVal("ted");

单独的方法,这可能吗?

+1

为什么不使用一个简单的数组来存储*参数*而不真正使用真正的*对象属性*?这样,你的`__set`和`__get`魔术方法总是被称为 – dcestari 2010-12-03 01:02:52

回答

2

使这些属性为protectedprivate然后__get__set将被调用,您可以委托给任何你想要的逻辑。

个人而言,我还没有看到一个案例,我会考虑使用任何东西public属性。

+0

DTO。欢迎来到适当编码的世界。 – Andrew 2014-12-29 17:38:40

0

您是否在谈论Magic Methods

+0

不,因为那些只会被调用未定义的属性:“当你尝试检索未定义属性的数据时,会自动调用这些方法。在上面的例子中,我正在谈论我已经定义的属性,比如`$ username`。 – imns 2010-12-03 01:06:52

3

执行__set方法。这在尝试访问不可访问的属性时被调用。

function __set($name, $value) { 
    $this->custom_set($name, $value); 
} 

但是请注意,这$username是公共属性,因此除非它被声明privateprotected这是不行的。

+0

还有__get – Webnet 2010-12-03 01:44:59