gpt4 book ai didi

PHP __set 和 __get 继承中的重载

转载 作者:行者123 更新时间:2023-12-05 03:14:11 25 4
gpt4 key购买 nike

我正在使用 PHP 实现 OOP 设计。我想知道 PHP 如何处理其神奇方法(如 __get 和 __set)的继承。

class Foo
{
protected $property1;

public function __get($name)
{
if ($name == "property1")
{
// do some logic
return $result; // may be null
}
return;
}

public function __set($name, $value)
{
if ($name == "property1")
{
// do some logic
return $result; // may be null
}
result;
}
}

现在扩展Foo:

class Bar extends Foo
{
protected $property2;

public function __get($name)
{
if (($result = parent::__get($name)) !== null)
return $result; // may be null
if ($name == "property2")
{
// do some logic
return $result; // may be null
}
return;
}

public function __set($name, $value)
{
if (($result = parent::__set($name, $value)) !== null)
return $result; // may be null
if ($name == "property2")
{
// do some logic
return $result; // may be null
}
return;
}
}

由于 PHP 返回 null 作为函数的结果,没有任何返回...这可能导致 parent::__get()parent::__set() 真返回null或返回无值;并导致开销。

现在,如果 PHP 首先考虑 static::_get()static::__set() 并回退到 parent 版本失败时,这可以简化为:

class Bar extends Foo
{
protected $property2;

public function __get($name)
{
if ($name = "property2")
{
// do some logic
return $result; // may be null
}
return;
}

public function __set($name, $value)
{
if ($name = "property2")
{
// do some logic
return $result; // may be null
}
return;
}
}

我无法在当前实现上对其进行测试,因为上下文中的类会操纵生产、实时数据库。哪个是正确的实现方式?

谢谢!

最佳答案

仅将魔术方法用作代理方法。您的代码将更加简洁,并且您不必处理继承引起的问题。

简单的例子:

class Foo
{
protected $property1;

public function setProperty1($property1)
{
// do some logic
$this->property1 = $property1;
return $this;
}

public function getProperty1()
{
// do some logic
return $this->property1;
}

public function __get($name)
{
$method = 'get' . ucfirst($name);
if (method_exists($this, $method)) {
return $this->$method();
}
}

public function __set($name, $value)
{
$method = 'set' . ucfirst($name);
if (method_exists($this, $method)) {
$this->$method($value);
}
}
}

class Bar extends Foo
{
protected $property2;

public function setProperty2($property2)
{
// do some logic
$this->property2 = $property2;
return $this;
}

public function getProperty2()
{
// do some logic
return $this->property2;
}
}

调用示例:

$bar = new Bar;
$bar->property1 = 'foo';
$bar->property2 = 'bar';
var_dump($bar);

关于PHP __set 和 __get 继承中的重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26489665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com