2011-11-23 77 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中的功能不需要使用方法。 –