1. PHP的哪些语言特征,在合适的场景可以显著减少程序的内存开销?
- Generator
- Trait
- Type hint
- SPL
解析:
Generator 生成器具体详解可以参考:
https://blog.51cto.com/chinalx1/2089327
如果不考虑用Generator来实现协程,那么Generator的一个最大的作用就是为含有大量数据的集合(当前这些数据集是规则的,就像range所返回的那些数据)的遍历节省空间。
Trait 详细了解参考https://blog.csdn.net/lemony521/article/details/78322652
是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制。
Type hint 类型提示
从PHP5开始,我们可以使用类型提示来指定定义函数时,函数接收的参数类型。如果在定义函数时,指定了参数的类型,那么当我们调用函数时,如果实参的类型与指定的类型不符,那么PHP会产生一个致命级别的错误(Catchable fatal error)。
SPL PHP标准库
SPL,PHP 标准库(Standard PHP Library) ,从 PHP 5.0 起内置的组件和接口,并且从 PHP5.3 已逐渐的成熟。SPL 其实在所有的 PHP5 开发环境中被内置,同时无需任何设置。
2. 对于PHP的自动加载描述正确的是
- 自动加载函数只支持按Class / Interface / Trait 名加载,不能按 function名加载
- Composer的自动加载是通过 __autoload 函数实现的
- 在文件顶部 use 的时候会载入对应的类
- 现在大多数类库都遵循PSR0 规范
解析:
自动加载的主要实现方式 __autoload 与 SPL 标准库提供的spl_autoload_register 函数两种,目前主流多是后一种。
两种方式的详解介绍可以参考:
https://www.jb51.net/article/166979.htm
https://www.jb51.net/article/31279.htm
spl_autoload_register 函数用法就是装载自定义的加载函数,所以自动加载函数能按function名加载。
Composer的自动加载是通过 __autoload 函数实现的
在文件顶部 use 的时候会载入对应的类
这里并不是,只用在具体调用类时才会加载类,lazy loading的意思。
可以参考:
https://blog.csdn.net/weixin_39610956/article/details/115148899
现在大多数类库都遵循PSR0 规范
PSR0实际是对实现自动加载的一种规范标准,PSR4是对PSR0的一些补充,简单说目前大多项目都会使用autoload自动加载机制,那么遵循PSR0规范也是必然的。
3. 对于 Trait 描述正确的是
- 子类中引入的 Trait 里的方法会覆盖父类的方法
- 在Trait中不可以调用引用类里的方法
- 一个类无法同时引入两个包含相同方法的 Trait
- 可以用来减少重复代码
解析:
关于Trait 的介绍在第一题中有链接可以阅读学习下。
子类中引入的 Trait 里的方法会覆盖父类的方法
这是正确的,Trait的优先级:自身方法>trait的方法>继承的方法
在Trait中不可以调用引用类里的方法
这是错误的!
代码如下:
trait HelloWorld{
public function sayHello(){
echo 'hello';
}
public function traitDemo(){
echo 'this trait';
$this->demo