2012-12-19 36 views
4

我有一個抽象類來擴展類以提供基本的orm函數。它提供的所有功能都受到類的保護,因此它可以決定將哪些字段公開提供給外部對象。但最近,我已經開始使用一些不需要如此複雜的小型數據類,並且可以從公開的orm編輯功能中獲益,而且不需要特殊的功能。更改PHP類函數的隱私範圍

由於函數的命名約定是充分和緊湊的,是否有方法將現有函數更改爲public(不需要相同的類或臨時擴展),還是必須使用新的traits功能的PHP添加一個現有的類,它包含作爲內部保護功能的抽象層的公共版本的功能?

編輯:

對於性狀的方法,我在想,這將有助於這樣的:

abstract class ORMClass { 
    public function __construct($pk) {} 
    protected function __get($k) {} 
    protected function __set($k,$v) {} 
    protected function save() {} 
} 

trait publicORM { 
    public function __get($k) { return parent::__get($k); } 
    public function __set($k,$v) { return parent::__set($k,$v); } 
    public function save() { return parent::save(); } 
} 

class myOrm extends ORMClass { 
    use publicORM; 
    protected static $table = 'myTable'; 
} 

這樣的話,我可以用myOrm像:

$myOrm = new myOrm(1); 
$myOrm->foo = 'alice' 
echo $myOrm->bar; 
$myOrm->save(); 

而不需要:

public function __get($k) { return parent::__get($k); } 
public function __set($k,$v) { return parent::__set($k,$v); } 
public function save() { return parent::save(); } 

要在課程中列出myOrm

+1

因此,您有一個受保護方法的類,並且在外部,您想修改該類以將其某些方法從protected更改爲public? – rid

+0

簡而言之,這就是它 – topherg

+0

我認爲你提到的臨時類方法會變得最好。創建另一個抽象類來擴展您的基礎,但具有公共訪問器,並且當您需要該行爲時子類THAT。 – grossvogel

回答

3

因爲這從來沒有得到正確回答,所以我添加了查爾斯答案。

這可以使用PHP的Reflection庫來完成的,因爲5版這種特定的方法內置於PHP是相當哈克:

<?php 

abstract class BaseClass { 
    protected function testMe() { 
     echo 'I WORK!'; 
    } 
} 

class ConcreteClass extends BaseClass { 
    // Class Code 
} 


$method = new ReflectionMethod('BaseClass', 'testMe'); 
$method->setAccessible(true); 
$method->invoke(new ConcreteClass()); // Prints 'I WORK!' 

這裏是使用擴展底座臨時抽象類的更好方法但使用公共方法:

<?php 

abstract class BaseClass { 
    protected function testMe() { 
     echo 'I WORK!'; 
    } 
} 

abstract class PublicBaseClass extends BaseClass { 
    public function testMe() { 
     parent::testMe(); 
    } 
} 

class ConcreteClass extends PublicBaseClass { 
    // Class Code 
} 


$obj = new ConcreteClass(); 
$obj->testMe();