当闭包和反射可用时,PHP中的OOP可见性有什么意义?

Nat*_*son 15 php oop reflection closures class

请考虑以下代码:

final class TinkerWithMe {
    protected $key1 = 19;
    private $key2 = 88;
}

$class = new TinkerWithMe();

$getKeys = function() {
    return array($this->key1, $this->key2);
};

$oldKeys = $getKeys->call($class);

$newKey1 = 96;
$newKey2 = 42;

$setKeys = function() use ($newKey1, $newKey2) {
    $this->key1 = $newKey1;
    $this->key2 = $newKey2;
};

$setKeys->call($class);
Run Code Online (Sandbox Code Playgroud)

当您可以通过闭包或反射轻松解决问题时,为什么还要考虑OOP的可见性?

有没有办法阻止我失踪的这种事情?

dec*_*eze 14

可见性修饰符不是铁包覆保护或确保任何类型的安全性或任何类似的东西.他们标记为如何在一段代码意图使用.

当像一个类一样编写一段代码时,其他代码片段将与它结合; 意味着您将编写其他代码来调用该类的方法或访问该类的属性.为了尽量减少与绝对必要的耦合,您需要保持类的公共接口尽可能小.当你指定某些东西时public,你将它标记为"一般用途".那个公共部分应该是相当稳定的而不是改变的,否则如果你改变它,你就有可能破坏很多耦合代码.

将某些东西标记为protected或将private这些部分标记为不是为了一般消费 ; 它澄清了这些实现细节可能在将来发生变化,或者不应被其他"不知情"的代码使用.这使您可以在以后根据需要更轻松地重构这些部分,并更好地了解其他部分可能会因此而破坏.当外部代码不直接修改内部值而不完全理解它应该如何执行时,它还有助于确保类的内部状态是一致的.

PHP会帮助您在一般情况下通过在天真地尝试访问protectedprivate从"外部" 访问属性时抛出错误来兑现这些标记; 这可以防止大多数意外使用和不必要的耦合.PHP不会向后弯曲以确保在所有可能的情况下这些属性都无法访问.如果你真的很想拍自己的脚,那就这样吧.也许您需要这样做以进行测试; 绝对阻止你这样做是违法的.

Python口头禅:

我们都在这里同意成年人.

  • 如果你的意思是"私人",如"安全":可见性修饰符不是正确的工具.实际上,没有语言可以保护您免受在同一程序/线程/上下文中运行的代码的影响.是的,如果您选择运行某些代码,则必须信任该代码.如果您不信任该代码,请不要运行它. (4认同)