Final
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承,否则会产生致命错误。属性不能被定义为 final,只有类和方法才能被定义为 final。
<?php
/*class A{
public final function test(){
}
}
class B extends A{
public function test(){
}
}*/
/*final class A{
public final function test(){
}
}
class B extends A{
}*/
?>
对象和引用
PHP中引用是别名,就是两个不同的变量名字指向相同的内容。PHP5中,一个对象变量不再保存整个对象的值,而是保存一个标识符来访问真正的对象内容,当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。PHP中通过&来进行引用传递。
<?php
class A{
}
class B{
}
$a=new A();
$a2=$a;
$a3=&$a;
$a=new B();
var_dump($a===$a2);//传递标识符的拷贝,改变a的标识符不影响a2。
var_dump($a===$a3);//a3是a的引用,改变a的标识符影响a3。
?>
类型约束
PHP5起可以使用类型约束,函数的参数可以指定必须为对象(对象所属类的名字)、接口、数组(PHP5.1+)或者callable(PHP5.4+)。但是如果使用NULL作为参数的默认值,在调用函数的时候依然可以使用NULL做为实参。如果一个类或接口指定了类型约束,则其所有的子类或实现也都如此。类型约束不能用于标量类型(如int或string)也不能用于trait。
<?php
interface A{
public function foo();
}
class B implements A{
public function foo(){
echo "foo in B\n";
}
}
function test(B $obj=null){
if($obj!=null){
$obj->foo();
}
}
function test2(A $obj){
$obj->foo();
}
function test3(array $arr){
foreach ($arr as $value) {
echo "$value\t";
}
echo "\n";
}
function test4(callable $call,$data){
call_user_func($call, $data);
}
$b=new B();
test($b);
test2($b);
test3(range('a','e'));
test4('test3',range('a','e'));
test4('test2',$b);
test(null);
?>