可以限制在PHP中调用方法的方式吗?
鉴于我的班级是这样的:可以限制在PHP中调用方法的方式吗?,php,scope,methods,Php,Scope,Methods,鉴于我的班级是这样的: class Methods{ function a(){ return 'a'; } function b(){ $this->a(); } function c(){ $this->a(); } } 是否可以确保只能从函数b调用函数a 在上面的示例中,函数c应该失败。我可以将其包含在函数b中,但将来我可能想让一些新函数调用a()(例如d()或
class Methods{
function a(){
return 'a';
}
function b(){
$this->a();
}
function c(){
$this->a();
}
}
是否可以确保只能从函数b调用函数a
在上面的示例中,函数c应该失败。我可以将其包含在函数b中,但将来我可能想让一些新函数调用
a()
(例如d()
或e()
)从学习方法之间的差异开始。。。在想做像这样极其复杂的事情之前,至少掌握OOP的基本知识是很有用的。
是的,可以使用debug_backtrace()来标识方法调用的来源;但这是一个非常大的开销。。。。我认为设置这样的限制没有实际意义。不太可能
- 您可以通过检查()的结果来检查调用方
- 您可以将其设置为私有,以避免从类外部调用它,然后将c()移到类外部
class Methods
{
private function a()
{
$bt = debug_backtrace();
if(!isset($bt[1]) || $bt[1]['function'] != 'b' || $bt[1]['class'] != get_class($this))
{
//Call not allowed
return NULL;
}
}
function b()
{
//allowed
$this->a();
}
function c()
{
//not allowed
$this->a();
}
}
我认为没有必要限制同一类中的方法调用其他方法 也许你的模型错了,你必须创建两个类?一个类应该是一个逻辑单元
如果您使用单独的类,您可以使用on方法
a
,并且不能再从类外调用它。最接近您所要求的是您想要限制它的方法内的。在定义闭包的方法之外无法访问闭包。这些方法通常用于定义回调并传递给其他方法,但您可以直接调用它
class Methods{
function b(){
$a = function() {
return 'a';
}; // don't forget the trailing ';'
$a();
}
function c(){
$this->a(); // fails
}
}
使方法私有或受保护将防止从类外调用它,但不会限制类内哪些方法可以访问它。在某种程度上,您需要相信您的代码能够遵循API的使用规则
类通常是信任的单元封装,如果您将方法从外部使用为私有,并对其进行文档化,那么您应该能够信任它在类中得到了正确的使用。如果不是,也许这个类已经变得太大了,是时候重构了
正如@Sjoerd所提到的,您也可以检查调用堆栈,但是同意@Mark Baker的观点,这几乎没有价值;这类似于滥用语言,也会使您的代码一团糟。以下内容可能适用于您的问题
class First {
public function a() {
$second = new Second();
// Works in this context!
$second->b($this);
}
}
class Second {
public function b($context) {
if (!$context instanceof First)
throw new Exception('Can only be called from context of "First".');
echo 'b';
}
}
class Third {
public function c() {
$second = new Second();
// Doesn't work out of context.
$second->b($this);
}
}
警告这不会阻止Third
调用该方法,因为它可以提供对Second
实例的引用。但它确实使流程更加严格,并且您的文档可以说明它以这种方式工作的原因
也许这是有用的,它似乎适用于一个类似的问题,我有相当好的。没有(丑陋的黑客除外)。你为什么要那样做?你想实现什么?好吧,我会采取另一种方式,因为大家普遍认为这个想法很糟糕……如果
c()
不应该调用a()
不要在c()中调用它