如何确定PHP的Closure范围以及它如何与类声明相关?

时间:2014-06-24 07:18:27

标签: php oop functional-programming closures

我试图在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中实现)?

1 个答案:

答案 0 :(得分:2)

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

如何将class PrivateClass {}括起来并不重要,因此在执行UsesPrivateClass()后的最后一行没有例外。但是,如果您不执行该功能,则该类将不可用。