PHP面向对象-参数约束与自动加载

函数的参数约束

函数可以指定参数对象的类型
1、在php5.3后才支持
2、只能约束对象,不能约束基本类型


父类不会被子类参数约束

子类对象给父类形参传参时可以进行

class Person{
}
class Student extends Person{
}
function show(Person $person){
    var_dump($person);
}
show(new Student);

//object(Student)#1 (0) { }

类的自动加载

实际开发时,经常一个类存放一个文件,如果手动加载类,会很麻烦

1.手动加载类

require 'Goods.class.php'; //父类
require 'Books.class.php';
require 'Phone.class.php';
$book=new Books();
$phone=new Phone();
$book->setName('PHP');
$phone->setName('IPhone');
$book->getName();
$phone->getName();

2. spl_autoload_register()自动加载类

__autoload()函数也可以自动加载类, 但spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载(同一个应用中,可以支持任意数量的加载器,比如第三方库中的)。因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用。

spl_aotoload_register()需要放在开头,第一个参数为一个函数,默认为spl_autoload(),该函数为__autoload()的默认实现

//使用匿名函数
spl_autoload_register(function ($class) {
    include './' . $class . '.class.php';
});
$book = new Books();
$book->setName("PHP");
$book->getName();
$phone = new Phone();
$phone->setName("iPhone");
$phone->getName();
?>

3.若类的存放地址规则,可以写出规则来加载类

//通过命名规则加载类

spl_autoload_register(function($class_name) {
    if(substr($class_name,-3)=='Lib'){
        require "./Lib/{$class_name}.class.php";
    }
});

4. 若类的存放地址不规则,可以将类的地址映射到数组中加载

若类的存放地址不规则,可以使用以下形式

//将类的地址映射到数组中加载
spl_autoload_register(function($class_name) {
    $map=array(
        'Goods' =>  './Goods.class.php',
        'Books' =>  './Books.class.php',
        'Phone' =>  './Phone.class.php'
    );
    require $map[$class_name];
});

你可能感兴趣的:(PHP面向对象-参数约束与自动加载)