【问题标题】:PHP - Overriding propertiesPHP - 覆盖属性
【发布时间】:2011-11-23 23:30:32
【问题描述】:

有没有办法防止在 PHP 中覆盖属性?如果是 - 如何?

【问题讨论】:

  • 你的意思是像public, protected or private
  • 我在 Base 类中有一个名为 pbase 的受保护属性(例如),我想防止覆盖子类中的属性。
  • 让它private?
  • 当我将其设为私有时,我无法从子类中调用它,但我只想防止覆盖。
  • 我认为您需要一种方法来检索您的值,而不是普通属性。

标签: php properties overriding


【解决方案1】:

我想这就是你想要的:

class A{
    private $a;
    public function __construct(){
        $this->a = 'A';
    }
    public function __get($property){
        return $this->{$property};
    }
}

class B Extends A{
    public function getA(){
        return $this->a;
    }
    public function __get($property){
        return parent::__get($property);
    }
}

$b = new B;
echo $b->getA();

【讨论】:

  • 只有当你想要一个方法而不是一个属性并且你控制子类定义时才有效。
  • 否 :(。我不想将此属性称为属性 :D 谢谢。
  • @user997379 - 你必须展示你需要如何实现它;简短的回答,如果不使用方法,PHP 中的final-like 功能听起来是不可能的。
  • 您能否发布一些代码,并说明您希望在何处防止属性被覆盖以及您希望如何访问它们?
  • @JaredFarrish 评论给了我一个提示,如果你不希望父类有自己的属性,就像在基类中一样,现在是不可能的(对于属性,方法可以是final).
【解决方案2】:

这样做的唯一方法是在课堂上玩__set()但是__set 仅用于不可访问的属性。

对于公共属性,我认为没有任何方法可以防止覆盖。

你应该查看官方文档:http://fr2.php.net/manual/en/language.oop5.overloading.php

【讨论】:

  • 谢谢,但我知道 __set 是什么意思,但无法帮助我,因为我的属性已声明。
  • 所以我不认为你想做的事情是可能的......尝试找到另一种方法:将这些受保护的变量存储在私有数组中,并使用特定的 __get 访问它们
  • 无论如何,我没有声明我的属性和... :)
【解决方案3】:
class TheBaseClass {

  private $nomod = 'foo';

  public function getNoMod() {
     return $this->nomod;
  }
}

class TheChildClass extends TheParentClass {
   public function funcUsesNomod(){
      return 'The value of nomod is '. $this->getNomod();
   }
}

【讨论】:

  • 为了公平对待@dev-null-dweller,OP 似乎建议一种方法不起作用(它必须是一个属性,出于某种原因)。不过,我给你们两个都投了赞成票。
【解决方案4】:

“是的”,如果您将它们设为常量。查看How to implement a read-only member variable in PHP?的答案,不要跳过cmets。

例子:

class user {
  const ALWAYS_ONE = 1;
}

我猜,将属性声明为 private 也可以防止重载,但降序类也无法访问它们。

【讨论】:

  • 谢谢,但我需要在子类(它包含对象)中使用“属性接口”调用此属性
  • 我认为@Jared Farrish 是对的,使用一种方法。 (当你不拼出完整的场景时很难说)
猜你喜欢
  • 1970-01-01
  • 2013-07-19
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多