PHP 自学笔记 (4)

这边来分享关于载入文档的一些方法及clone方法。

1.手动加载

利用include引入即可,但include有缺点,他会重複引入,所以我们可以透过include_once来避免这个问题,如果在相同的档案中遇到另一个include或include_once语句时,PHP会检查它是否已经被汇入过,如果是,就忽略它。

除了include之外我们还可以使用require,require_once,而require与include最大差别在于前者遇到错误会立即停止,而后者会继续执行,至于用哪个就看自己的需求。

<?php// 当想获取其他文件下的class,直接获取会报错// $a = new Jojo(); // Uncaught Error: Class 'Jojo' not found// 首先我们判断class Jojo是否存在,如果不存在就加载,如果没有就不加载。if (!class_exists('Jojo')) {    echo "加载class";    // include './Jojo.php';    // 利用include_once取代include可避免重複多次载入档案    include_once './Jojo.php';}$a = new Jojo(); // Jojo

2.自动加载

当我们需要使用某class,而在当前文档,又找不到时,系统就会自动呼叫__autoload这个函数来加载class

<?php function __autoload($className){    echo $className;    // 定义统一的一个命名规範(.php)    include_once $className . '.php';    // 写上exit,确保加载完后不会继续执行,也可直接用require_once代替。    exit;}

当class在其他资料夹下,我们就可透过file_exists,来判定此路径的资料是否存在。

function __autoload($className){    // 寻找c资料夹    $c_file = 'c/' . $className . '.php';    echo $c_file, '<br/>';    if (file_exists($c_file)) {        include_once $c_file;        exit;    } else {        // 寻找m资料夹        $m_file = 'm/' . $className . '.php';        echo $m_file, '<br/>';        if (file_exists($m_file)) {            include_once $m_file;            exit;        }    }}$a = new Eva();

但__autoload是在php7以前,而系统则推荐我们使用spl_autoload_register(定义好的函数),其本质与__autoload一样。

1.自定义加载函数

<?phpfunction my__autoload($className){    // 寻找c资料夹    $c_file = 'c/' . $className . '.php';    $m_file = 'm/' . $className . '.php';    if (file_exists($c_file)) {        include_once $c_file;    } else {        if (file_exists($m_file)) {            include_once $m_file;        }    }}// 此时,上述函数并不会自动执行,而是要利用spl....呼叫他。spl_autoload_register('my__autoload');$a = new Eva(); // Eva

2.class自动加载

class Autoload{    // 不同资料夹的自动加载    public static function loadC($className)    {        $c_file = 'c/' . $className . '.php';        // 如果该资料夹下档案存在Eva就载入        if (file_exists($c_file)) {            require_once $c_file;        }    }    public static function loadM($className)    {        $m_file = 'm/' . $className . '.php';        //  如果该资料夹下档案存在Eva就载入        if (file_exists($m_file)) {            require_once $m_file;        }    }}// 自动加载// 我们传入一个阵列作为参数,如果我们传入的是class名,就表示为一个静态的获取// 第一个参数为class名,第二个为方法名spl_autoload_register(array('Autoload', 'loadC'));spl_autoload_register(array('Autoload', 'loadM'));$a = new Eva(); // Eva

clone

物件理论上应由实体化产生,但有时候我们可以在已存在的物件,在产生一个新的物件,这时候就可以透过clone来达到。

class Bobo{    public $name;    private $money = 0;    // clone方法(clone出的物件会自动呼叫)    // public function __clone()    // {    //     echo __METHOD__, '<br/>'; // Bobo::__clone    //     $this->money = 87;    //     var_dump($this);    //     // object(Bobo)#2 (2) { ["name"]=> NULL ["money":"Bobo":private]=> int(0) }    // }    // 如果不想要物件被外部clone,就可以将其设为private    private function __clone()    {        echo __METHOD__, '<br/>'; // Bobo::__clone    }}// 实体化$a1 = new Bobo();// clone物件$a2 = clone $a1;// 可发现两者已为不同物件,代表两者在不同的记忆体空间// var_dump($a1, $a2);// object(Bobo)#1 (2) { ["name"]=> NULL ["money":"Bobo":private]=> int(0) }// object(Bobo)#2 (2) { ["name"]=> NULL ["money":"Bobo":private]=> int(87) }

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章