更改PHP类函数的隐私范围

时间:2012-12-19 16:12:15

标签: php class scope abstract-class

我有一个抽象类,它扩展了类以提供基本的orm函数。它提供的所有功能都受到类的保护,因此它可以决定哪些字段可以公开提供给外部对象。但是最近,我已经开始使用一些不需要这么复杂的小型数据类,并且可以从公共可用的orm编辑功能中获益,而且没有特殊的功能。

由于函数的命名约定足够紧凑,有没有办法将现有函数更改为public(不需要相同的类或临时扩展),或者我是否必须使用新的{{1 php的一个特性是添加一个现有的类,它包含作为内部受保护函数的抽象层的函数的公共版本?

编辑:

对于特质方法,我认为它会有所帮助:

traits

所以我可以使用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();

将在myOrm类中列出

1 个答案:

答案 0 :(得分:3)

由于这从未得到正确回答,我正在加入Charles答案。

这可以使用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();