这边来分享关于载入文档的一些方法及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) }