好的,所以现在我的面条烤了一会儿。我有一个类,它有一个定义全局可访问函数的方法。我的问题是:内部类方法如何定义可在全局范围内访问的函数?
以下是一个示例:
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!";
}
}
}
}
该类像往常一样实例化,并且在应用程序的早期实例化,但它在另一个类的方法中实例化。它是一个浅的范围链,但是嵌套得足以让它(对我而言)为什么它可以在应用程序之外访问。这违背了我对封装的理解,一些见解会非常感激。
答案 0 :(得分:3)
声明的函数将始终具有全局范围。这不是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){
}
}
}