PHP特性

名称空间:
基本概念:命名空间将代码划分出不同的空间(区域),每个空间的常量、函数、类(为了偷懒,我下边都将它们称为元素)的名字互不影响, 这个有点类似我们常常提到的‘封装'的概念。
名称空间:一个抽象的容器,优点如下
1.一个名称空间中的所有函数、类和常量都自动冠以名称空间前缀
2.非全路径的类、函数和常量名称在运行时解析,在查看全局空间之前,将首先查看名称空间
自定义异常类:
1.Exception类很多函数都是final定义的
2.__toString()可以被重载

Session:
PHP在使用默认的 session.save_handler = files 方式时,PHPSESSIONID的生产算法原理如下:
hash_func = md5 / sha1 #可由php.ini配置
PHPSESSIONID = hash_func(客户端IP + 当前时间(秒)+ 当前时间(微妙)+ PHP自带的随机数生产器)
从以上hash_func(*)中的数据采样值的内容分析,多个用户在同一台服务器时所生产的PHPSESSIONID重复的概率极低(至少为百万份之一),设想,但台动态Web Server能到2000/rps已经很强悍了。
另外,黑客如果要猜出某一用户的PHPSESSIONID,则他也必须知道“客户端IP、当前时间(秒、微妙)、随机数”等数据方可模拟。

多进程和多线程的区别:
进程:程序在计算机上的一次执行活动。
线程:就是把一个进程分为很多片,每一片都可以是一个独立的流程
总结:
PHP:是一种支持多进程,但是属于单线程的语言,多线程代指“不安全”
LNMP:PHP以php-fpm方式运行,那么就不涉及到线程安全这个问题了,因为php-fpm是以多进程的方式来运行的
LAMP(mod_php):Apache支持以多线程的方式运行(Worker),也支持以多进程的方式运行(Prefork),一般来讲,Linux下的Apache绝大多数都是运行在Prefork模式下,这是出于稳定性的考虑
PS:PHP安装为线程安全,会比非线程安全多占用一些CPU,并且可能会增加bug或者不稳定的问题

traits:
概念:和class相似,但基类不需要继承才能使用其函数,而是通过在类中定义use来使用其函数,可使用TRAIT来访问其名称
优先级:当前类的成员 > trait 的方法 > 被继承的方法。

trait ezcReflectionReturnInfo
{
// 如果 trait 定义了一个属性,那类将不能定义同样名称的属性,否则会产生一个错
// 误
public $x = 1;
public static $c = 0;
public static function inc() {
self::$c = self::$c + 1;
echo self::$c . "\n";
}
// 抽象函数,必须被实现
abstract public function getWorld();
functiongetReturnType()
{
/*1*/
}
functiongetReturnDescription()
{
/*2*/
}
}
classezcReflectionMethod extends ReflectionMethod
{
useezcReflectionReturnInfo;/*...*/
}
classezcReflectionFunctionext endsReflectionFunction
{
useezcReflectionReturnInfo;/*...*/
}
?>

通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中

namespace Foo\Bar;
class SomeClass {
// 读取的命名空间为 \Foo\Bar\Foo\Test
use Foo\Test;
}

冲突的解决:
如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。
为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。
以上方式仅允许排除掉其它方法,as 操作符可以将其中一个冲突的方法以另一个名称来引入。

修改方法的访问权限
使用 as 语法还可以用来调整方法的访问控制。
例如

从 trait 来组成 trait
正如类能够使用 trait 一样,其它 trait 也能够使用 trait。在 trait 定义时通过使用一个或多个 trait,它能够组合其它 trait 中的部分或全部成员。
从 trait 来组成 trait的例子

sayHello();
$o->sayWorld();
?>
以上例程会输出:Hello World!

PS:如果Trait的方法可以被定义为在普通类的静态方法,就可以被直接调用

你可能感兴趣的:(PHP特性)