2011-11-23 76 views
2

有没有一种方法可以防止在PHP中重写属性?如果是 - 如何?PHP - 重写属性

+2

你的意思是像[公有,保护或私有(http://php.net/manual/en/language.oop5.visibility。 PHP)? –

+0

我有一个被称为pbase的类Base中的受保护的属性(例如),我想防止覆盖子类中的属性。 – user997379

+4

使它['私人'](http://codepad.org/9sxXFi2X)? –

回答

1

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

对于公共财产,我不认为有什么办法可以防止重写。

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

+0

谢谢,但我知道什么意思__set并不能帮助我,因为我的属性被声明。 – user997379

+0

所以我不认为你想要做什么是可能的... 尝试找到另一种方式:将这些受保护的变量存储在私有数组中,并使用特定的__get – Lao

+0

来访问它们所以,我没有声明我的属性和。 .. :) – user997379

0

“是的”,如果你让他们常量。请参阅How to implement a read-only member variable in PHP?的答案,不要跳过评论。

实施例:

class user { 
    const ALWAYS_ONE = 1; 
} 

我想,声明特性private也可防止过载但它们也无法进入到下降类。

+0

谢谢,但我需要调用属性在子类(它包含对象)与“属性界面” – user997379

+1

我认为@Jared Farrish是正确的,使用一种方法。 (很难说清楚什么时候你不能说出完整的场景) – chelmertz

1
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(); 
    } 
} 
+1

我是Jared Farrish,我赞同这个信息。 –

+1

为了公平对待@ dev-null-dweller,OP似乎暗示一种方法不起作用(由于某种原因它必须是一个属性)。不过,我已经给你两个upvotes。 –

4

我想这是你想要什么:

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(); 
+1

只有当你想要一个方法而不是一个属性,并且你控制了子类的定义时,这才有效。 –

+0

没有:(我不想叫这个属性作为财产:D谢谢。 – user997379

+0

@ user997379 - 你将不得不显示你是如何需要它的实现;简短的回答,这听起来不可能的[''final'-like](http://en.wikipedia.org/wiki/Final_%28Java%29)在PHP中的功能不需要使用方法。 –