php - 更改 PHP 类函数的隐私范围

标签 php class scope abstract-class

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

由于函数的命名约定足够紧凑,有没有办法将现有函数更改为公共(public)函数(不需要相同的类或临时扩展),或者我必须使用新的 php 的特征 添加现有类的特性,其中包含充当内部 protected 函数抽象层的函数的公共(public)版本?

编辑:

对于 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 中列出

最佳答案

由于这个问题从未得到正确回答,我添加了 Charles 的回答。

这可以使用 PHP 的 Reflection 来完成库,从版本 5 开始内置到 PHP 中。这个特定的方法相当 hacky:

<?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!'

下面是使用扩展基类但使用公共(public)方法的临时抽象类的更好方法:

<?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();

关于php - 更改 PHP 类函数的隐私范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13956475/

相关文章:

class - 将类成员函数传递给 for_each

Java Scanner 类读取字符串

javascript - 尝试保持输入参数不变

c#范围问题

javascript - jQuery 插件选项

php - 部署生产 Laravel 5.2 应用程序的正确步骤是什么?

PHP处理大字符串

php - 如何知道网站在手机或PC浏览器中打开?

php - Elasticsearch地理位置搜索未返回英里单位的结果

c++ - 如何为类提供几个可变参数模板模板参数