首页 > 代码库 > final,类的自动加载,命名空间

final,类的自动加载,命名空间

final是干什么的
一般是为了防止父类的一个方法被重写
如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
Note: 属性不能被定义为 final,只有类和方法才能被定义为 final。

 

类的自动加载
类的自动加载是指,在外面的页面中,并不需要去“引入”类文件,但是程序会在需要的时候动态加载需要的类文件。
spl_autoload_register() 函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载。通过注册自动加载器,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。

PHP的类自动加载机制
在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来。这个在小规模开发的时候,没什么大问题。但在大型的开发项目中,这么做会产生大量的require或者include方法调用,这样不因降低效率,而且使得代码难以维护,况且require_once的代价很大。
在PHP5之前,各个php框架如果要实现类的自动加载,一般都是按照某种约定自己实现一个遍历目录,自动加载所有符合约定规则的文件的类或函数。 当然,PHP5之前对面向对象的支持并不是太好,类的使用也没有现在频繁。 在PHP5后,当加载PHP类时,如果类所在文件没有被包含进来,或者类名出错,Zend引擎会自动调用__autoload 函数。此函数需要用户自己实现__autoload函数。 在PHP5.1.2版本后,可以使用spl_autoload_register函数自定义自动加载处理函数。当没有调用此函数,默认情况下会使用SPL自定义的spl_autoload函数。


PHP中类的自动加载的方法

使用__autoload魔术函数

<?php
//需要类是自动调用,而且会传进来一个类名,这个案例的文件名为21A.class.php,类名为A
function __autoload($className){
require "./21".$className.".class.php";
}
$o1 = new A();
$o1->v1 = 10;
echo "<br/>v1:".$o1->v1;
?>

使用spl_autoload_register函数


<?php
//注册两个用于自动加载的函数名
spl_autoload_register(‘auto1‘);
spl_autoload_register(‘auto2‘);
function auto1($className){
$file = "./21".$className.".class.php";
if(file_exists($file)){
require "./21".$className.".class.php";
}
}
function auto1($className){
$file = "./22".$className.".class.php";
if(file_exists($file)){
require "./22".$className.".class.php";
}
}
//如果需要一个类,但这个页面还没有记载,就会依次调用auto1和auto2,知道找到该类文件并加载
?>

 

命名空间
用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:

命名空间提供了一种将相关的类、函数和常量组合到一起的途径

命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。

<?php

/*
* namespace 命名空间
* 它必须在所有代码的最前面
* 可以在一个文件中定义多个命名空间,但是不建议这样做
*/

namespace MyProject ;

const CONNECT_OK = 1 ;
class Connection { /* ... */ }
function connect () { /* ... */ }

?>

 

final,类的自动加载,命名空间