加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

更改PHP类函数的隐私范围

发布时间:2020-12-13 16:48:56 所属栏目:PHP教程 来源:网络整理
导读:我有一个抽象类,它扩展类以提供基本的orm函数.它提供的所有功能都受到类的保护,因此它可以决定哪些字段可以公开提供给外部对象.但是最近,我开始使用一些不需要这种复杂性的小型数据类,并且可以从公共可用的orm编辑功能中获益,而且没有特殊功能. 由于函数的命
我有一个抽象类,它扩展类以提供基本的orm函数.它提供的所有功能都受到类的保护,因此它可以决定哪些字段可以公开提供给外部对象.但是最近,我开始使用一些不需要这种复杂性的小型数据类,并且可以从公共可用的orm编辑功能中获益,而且没有特殊功能.

由于函数的命名约定足够紧凑,有没有办法将现有函数更改为public(不需要相同的类,或临时扩展),或者我必须使用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); }
public function save() { return parent::save(); }

要在类myOrm中列出

解决方法

由于这从未得到适当的回答,我正在加入查尔斯答案.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读