PHP中默认类的可见性是啥?
Posted
技术标签:
【中文标题】PHP中默认类的可见性是啥?【英文标题】:What's the visibility of a class by default in PHP?PHP中默认类的可见性是什么? 【发布时间】:2016-11-22 03:54:06 【问题描述】:我可以在php manual 中找到属性和方法的默认可见性。但我找不到任何关于课程本身的信息。
我的猜测是它是公开的。但是,如果有人可以链接到手册中所写的部分,我将不胜感激。
【问题讨论】:
PHP 不支持公共类以外的任何东西 PHP 没有包的概念(命名空间有些相似但不一样),类可见性的概念在 PHP 中没有意义。他们实际上总是公开的 在 PHP 中,类通常总是公开的;现在在 PHP 7 中有一个例外......“匿名类”,其定义和实例化总是直接在您的代码控制之下的类,因此可以用作私有类 @ÁlvaroGonzález 如果我用 PHP 编写一个类库,那么使用该库的每个人都可以直接访问实例化该库中存在的任何类,无论何时何地;这可能并不总是一个好主意。非公共类将允许我定义只能从我的库本身实例化的类,从而减少直接访问外部代码导致问题的可能性 @ÁlvaroGonzález 在 Java 中,未明确声明为public
的类只能由同一包中的类使用(想想 PHP 中的 namespace
)。在 C# 中,未显式声明为 public
的类默认被视为 internal
,这意味着它们只能由同一程序集中的类使用(我认为 PHP 中没有相应的概念)。 “被使用”包括继承等。总体而言,类可见性是一个不错的功能,因为它允许隐藏作为实现细节的类,从而改进程序模块的封装。
【参考方案1】:
简单地说
公开。 PHP 不支持公共类以外的任何东西。
与 Java/.NET/etc 不同,没有任何包、程序集、内部或嵌套类的概念。命名空间本质上只是避免 IncrediblyLongClassNames 的语法糖,并且不能提供对可见性的任何实际更改。
整个想法在非编译语言中意义不大,因为无论您使用什么范围,任何人仍然可以获取您的类并公开声明它。
PHP 7 附带条件:匿名类
PHP 7 引入了anonymous classes* 的概念,允许动态类定义。作为一个非常基本的例子:
<?php
$foo = new class
public function hello($what)
echo 'Hello ', $what, PHP_EOL;
;
(new $foo)->hello('world');
# Hello world
因为这些可以分配给变量,所以它们可以被限制在该变量的范围内,并像其他任何东西一样传递。
与大多数允许匿名类的语言不同,在 PHP 中它们确实不从定义它们的范围内继承任何东西。链接的文档有一些示例,说明如何通过将匿名类定义为从父类继承或传入构造函数参数来解决此问题。
*严格来说,他们确实有名字,因此如果有人可以在一个实例上运行get_class()
,那么他们就可以实例化他们自己的副本,因为they aren't garbage collected。
【讨论】:
【参考方案2】:PHP 总是“默认”公开的,但这里最准确的答案是 PHP 类无论如何都没有这样的概念。
【讨论】:
以上是关于PHP中默认类的可见性是啥?的主要内容,如果未能解决你的问题,请参考以下文章