Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP重写获取集方法_Php - Fatal编程技术网

PHP重写获取集方法

PHP重写获取集方法,php,Php,是否可以覆盖我已经设置的参数的get和set方法?所以每次我设置一个参数,我都有权使用它/验证它 class User { public $username; function custom_set($name, $value) { if(strlen($value) < 5) { return "not long enough"; } else { $this->$name = $value; }

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

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;
类用户{
公共$username;
函数自定义设置($name,$value){
如果(strlen($value)<5){
返回“不够长”;
}否则{
$this->$name=$value;
}
}  
}
$u=新用户();
$u->username=“ted”;
echo$u->username;
输出:“不够长”

这是一个非常简单的例子,我刚刚写了出来,可能包含错误,这只是为了传达我想做的

基本上每次我调用
$u->username=“任何东西”
我希望调用
custom\u set
方法

我不想在构造函数中进行验证,也不想创建单独的方法,比如
$u->setVal(“ted”)

这可能吗?

你在说什么?

你在说什么?

实施该方法。当试图访问不可访问的属性时,将调用此函数

function __set($name, $value) {
    $this->custom_set($name, $value);
}
但是,请注意,
$username
是一个公共属性,因此除非声明为
private
protected
以实现该方法,否则该属性将不起作用。当试图访问不可访问的属性时,将调用此函数

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

但是,请注意,
$username
是一个公共属性,因此除非声明它为
private
protected
将这些属性设置为
protected
private
,否则此属性将不起作用,然后将调用
\u get
\u set
,并且您可以委托给任何您想要的逻辑


个人,我还没有看到一个案例,我会考虑使用<代码>公共>代码>属性。

< p>使那些属性<代码>保护或<代码>私有< /代码>,然后<代码>

个人,我还没有看到一个案例,我会考虑使用<代码>公共< /COD>属性来做任何事情。

为什么不使用一个简单的数组来存储参数,而不是真正使用真正的对象属性呢?这样,您的
\u集
\u获取
魔术方法将始终被调用,为什么不使用简单数组存储参数,也不真正使用真实对象属性?这样,您的
\u集
\u获取
魔术方法将始终被调用为no,因为这些方法只会为未定义的属性调用:“当您尝试检索未定义属性的数据时,会自动调用此方法”。我说的是我在上面的例子中已经定义的属性,比如
$username
。不,因为这些属性只会被未定义的属性调用:“当您尝试检索未定义属性的数据时,会自动调用此方法”。我说的是我已经定义的属性,比如上面示例中的
$username
。欢迎来到正确编码的世界。DTO/VO是一种正确的用法,但我很少在PHP中使用这些模式,除非您想计算内部类,如
StdClass
SoapVar
SoapParam
。我想说这是可悲的(关于稀有性)。人们应停止将数据存储与数据操作混为一谈,并应将这些内容分为不同的对象。即使VO成员不是公共的,他们也只能在施工任务中被保护/私有,否则它就不是一成不变的,据我所知,这是VO模式的关键要求。就DTO而言,这是一组完全不同的“如何/何时使用”问题,当然不符合SOC WRTG存储/操作的笼统陈述。此外,就分离这些内容而言,域对象直接提供给存储层用于持久化的数组与使用DO IMO一样有效(至少在狂野的西方世界的PHP…YMMV在其他语言中)欢迎来到正确的编码世界。DTO/VO是一个正确的用法,但我很少看到在PHP中使用这些模式,除非你想计算像
StdClass
SoapVar
SoapParam
这样的内部类。我想说这是可悲的(关于稀有性)。人们应停止将数据存储与数据操作混为一谈,并应将这些内容分为不同的对象。即使VO成员不是公共的,他们也只能在施工任务中受到保护/私有,否则这将不是一成不变的,据我所知,这是VO patt的关键要求ern.就DTO而言,这是一组完全不同的如何/何时使用的问题,当然不能符合SOC WRTG存储/操作的笼统陈述。此外,就分离这些内容而言,域对象直接提供给存储层用于持久化的数组与使用DO IMO一样有效(至少在狂野的西方世界的PHP…YMMV在其他语言)。也许有更多的经验,我会改变我的想法,但还没有。