当前位置: 首页 > 知识库问答 >
问题:

更改PHP类函数的隐私范围

白智
2023-03-14

我有一个抽象类,它扩展类以提供基本的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个答案

段溪叠
2023-03-14

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

这可以使用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();
 类似资料:
  • 问题内容: 这更多的是 困惑而 不是问题。我有以下代码: 即使基类构造函数为,在这里也允许对1 * 的调用。如果我们在同一包中将这些类编写为单独的类: 编译器正确地在2 *处给出了错误,因为基类构造函数不可见。 当两个类在一个类中都声明为静态时,为什么编译器没有在我的第一种情况下引发错误? 问题答案: 如果成员或构造函数被声明为私有,则仅当访问发生在包含成员或构造函数的声明的顶级类(第7.6节)的

  • 问题内容: 这似乎是一个愚蠢的问题,但是此函数是否会实际影响变量(我将如何使用此变量的上下文更大,但这基本上是我不确定的问题)?(我专门问有关java) 问题答案: 考虑一个稍微不同的示例: 运行该程序的输出为: 该变量将更改为true,但是一旦方法返回,该参数变量就会消失(这就是人们所说的“超出范围”的意思)。但是,传递给方法的变量保持不变。

  • 问题内容: 我的应用程序中有以下服务: 然后在这样的控制器中使用它: 因此,基本上我的服务每5秒更新一次,因此我将其链接到。然后,我尝试了类似的不同方法,但是对所做的更改未反映在控制器和视图中。 它在我的模板中仍然为空。您知道我如何传播这些变化吗? 问题答案: 虽然使用可以解决问题,但这不是最有效的解决方案。您可能想要更改在服务中存储数据的方式。 问题是您每次在为范围分配指向旧位置的范围内分配新值

  • 我正在重构一个越来越大的android项目。运行lint使我能够在外部类和内部类之间访问JSME问题私有成员。考虑下面的例子 我得到消息了 应用问题解决方案会将源更改为 我现在有点困惑。直到现在,我还以为这个例子相当于 在这种情况下,我错了吗?还是这是棉绒的问题?

  • 问题内容: 我们需要将某些列的数据类型从int更改为bigint。不幸的是,其中一些表很大,大约有7-10百万行(但不宽)。 Alter表alter列将永远保留在这些表上。有没有更快的方法来实现这一目标? 问题答案: 巧合的是,大约3个小时前,我不得不做一些非常相似的事情。该表是3500万行,它相当宽,并且花了很多时间才能做到这一点: 这就是我最终得到的结果: 这次,这些陈述几乎是即时的。(在速度

  • 5.5 处理隐私数据 近年来,“隐私设计”概念已被提出,作为保护隐私数据的全球趋势。基于这一概念,各国政府正在推动隐私保护立法。 在智能手机中使用用户数据的应用必须采取措施,来确保用户可以安全地使用应用,而不必担心隐私和个人数据。这些步骤包括适当处理用户数据,并要求用户选择应用是否可以使用某些数据。为此,每个应用必须准备并显示应用隐私策略,指明应用将使用哪些信息,以及如何使用该信息;而且,在获取和