提问者:小点点

更改PHP类函数的隐私范围


我有一个抽象类,它扩展类以提供基本的orm函数。它提供的所有函数都受到类的保护,因此它可以决定哪些字段对外部对象公开可用。但是最近,我开始使用一些不需要如此复杂的较小的数据类,并且将受益于orm编辑功能的公开可用和没有特殊功能。

由于函数的命名约定是充分和紧凑的,有没有办法将现有函数更改为公共函数(不需要相同的类或临时扩展),或者我必须使用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();

在不需要以下条件的情况下:

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个答案

匿名用户

因为这个问题从来没有得到正确的回答,所以我添加了查尔斯的答案。

这可以使用PHP的反射库来完成,该库自版本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();