【问题标题】:PHP 8 equivalent of getter or setter for public propertiesPHP 8 等效于公共属性的 getter 或 setter
【发布时间】:2021-09-03 23:29:48
【问题描述】:

我正在 PHP 8 中创建一个基类,我希望在其中拥有一个 $isDirty 私有属性。 我希望扩展基类的类能够使用公共属性,以便它们显示在 IDE 中。 但是,我希望能够在任何时候设置或更改公共属性时设置 $isDirty 变量。 我已经能够使用 __set 魔术方法更新 $isDirty,但前提是继承的类属性是受保护的或私有的。但是,将它们设置为受保护或私有会阻止 IDE 自动完成功能工作。 有没有一种方法可以“注入”我的方法来设置一个变量时设置另一个变量而不将该变量的范围从公共更改为受保护?

【问题讨论】:

  • 拥有公共属性会导致各种问题,做出此类决定时要小心。

标签: php class


【解决方案1】:

您可以使用 PHPDoc 来声明类的属性。大多数 IDE 会识别它并且自动完成功能会起作用。

/**
  * @property boolean $isDirty
  */
class Something {
    private $isDirty;
}

【讨论】:

    【解决方案2】:

    我通过使用校验和变量并在构造函数中设置它,并在加载、保存或更新到数据库之后解决了这个问题。这是概念证明:

    Class Foo {
        public string $checksum = '';
    
        public function __construct()
        {
            $this->checksum = self::getChecksum();
        }
    
        public function getChecksum() : string {
            $values = '';
            foreach ($this as $key => $value) {
                if($key !== "checksum")
                    $values.= "$key=>$value,";
            }
            return md5($values);
        }
    }
    
    class Bar extends Foo {
        public string $name;
    }
    
    $a = new Bar();
    echo "<p>A checksum: ".$a->checksum."</p>";
    echo "<p>getChecksum:".$a->getChecksum()."</p>";
    $a->name = "Andrew";
    echo "<p>Checksum after setting name:".$a->getChecksum()."</p>";
    

    【讨论】:

      猜你喜欢
      • 2017-06-27
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      相关资源
      最近更新 更多