PHP'的闭包作用域是如何确定的?它与类声明有什么关系?


How is PHP's Closure scope determined and how does it relate to class declaration?

我试图在PHP私有类。为此,我编写了以下代码:

<?php
$UsesPrivateClass = function () {
    if (!class_exists('PrivateClass', false)) {
        class PrivateClass
        {
            function someUsefulMethod()
            {
                return 1;
            }
        }

        class UsesPrivateClass
        {
            function __construct($needsData)
            {
                $this->privateClass = new PrivateClass();
            }
            function getValue()
            {
                return $this->privateClass->someUsefulMethod() + 1;
            }
        }
    }
    //Return a UsesPrivateClassFactory
    return function ($needsData) {
        return new UsesPrivateClass($needsData);
    };
};
$UsesPrivateClass = $UsesPrivateClass();
//Now you can access the methods and data of the private class, without exposing it to the global object!
$usesPrivateClassInstance = $UsesPrivateClass("data needed");
echo $usesPrivateClassInstance->getValue(); //Prints out 2
$x = new PrivateClass(); //Throws exception

唯一的问题是最后一行$x = new PrivateClass(); //Throws exception没有抛出异常。我不知道为什么。类声明不是绑定到闭包对象吗?或者这是函数式编程语言和面向对象编程语言(至少在PHP中实现的)之间的一个粗糙的边缘?

PHP在定义类时不关心任何闭包,它始终是全局和公开可用的。

无论您如何包含class PrivateClass {},因此在执行UsesPrivateClass()后的最后一行没有异常。但是,如果不执行该函数,则该类将不可用。