gpt4 book ai didi

php - 我需要帮助理解在类方法中声明的函数的范围

转载 作者:行者123 更新时间:2023-12-04 05:27:18 25 4
gpt4 key购买 nike

好的,所以这已经烤了我的面条一段时间了。我有一个带有定义全局可访问函数的方法的类。我的问题是:内部类方法如何定义可在全局范围内访问的函数?

这是一个示例:

class MyClass 
{

// ... accessors, constuctors other methods, et al...

// The method in question:
private function myPrivateMethod()
{
if( !function_exists( 'someArbitraryFunction' ) )
{
function someArbitraryFunction( $args )
{
return "Hello, {$args} world!";
}
}
}
}

该类像往常一样在应用程序中很早就被实例化,但它是在另一个类的方法中实例化的。这是一个浅的作用域链,但嵌套得足够多,以至于(对我而言)为什么它可以在应用程序外部访问是没有意义的。这违背了我对封装的理解,一些见解将不胜感激。

最佳答案

声明的函数将始终具有全局作用域。这不是 JavaScript。

见:

class MyClass 
{

// ... accessors, constuctors other methods, et al...

// The method in question:
private function myPrivateMethod()
{
if( !function_exists( 'someArbitraryFunction' ) )
{
function someArbitraryFunction( $args )
{
return "Hello, {$args} world!";
}
}
}

public function run(){
$this->myPrivateMethod();
}
}

var_dump(function_exists('someArbitraryFunction')); // false
$obj = new MyClass();
$obj->run();
var_dump(function_exists('someArbitraryFunction')); // true

作为一种来自 C/C++ 背景的语言,函数和方法之间存在明显的行为。在 PHP 中,函数不服从访问修饰符。

不管它们写在代码的什么地方,一旦执行通过声明,它就变成了定义。

如果您需要一个函数来遵守作用域,我强烈建议您这样做,因为您可以更好地利用变量的 GC,您可以在 >= PHP 5.3 中使用闭包:
class MyClass{

private $myArbitraryMethod;

private function myPrivateMethod(){
$this->myArbitraryMethod = function($args){

}
}

}

关于php - 我需要帮助理解在类方法中声明的函数的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13042407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com