激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

php自動(dòng)加載--autoload()函數用法

時(shí)間:2024-08-26 06:25:50 PHP 我要投稿
  • 相關(guān)推薦

php自動(dòng)加載--autoload()函數用法

  autoload在php主版本中是自動(dòng)加載文件的一個(gè)方法了我們可以定義許多的文件在目錄然后通過(guò)autoload加載了,下面一起來(lái)看看autoload函數用法。

  在PHP5之后,我們可以通過(guò) __autoload來(lái)解決這個(gè)問(wèn)題。 而且在PHP5.1之后,還提供了 spl_autoload_register() 來(lái)提供更完善的加載機制。

  通過(guò)閱讀了 Autoloading in PHP 這篇文章,我理解的 Autoload 的加載機制,當通過(guò) new 來(lái)實(shí)例化一個(gè)類(lèi)時(shí),PHP會(huì )通過(guò)定義的__autoload 函數加載相應的文件,如果這個(gè)類(lèi)文件使用了 extends 或者 implements 需要用到其他的類(lèi)文件,php會(huì )重新運行 autoload 去進(jìn)行類(lèi)文件的查找和加載,如果發(fā)生了兩次對同一類(lèi)文件的請求,就會(huì )報錯

  自動(dòng)加載原理

  在使用PHP的OO模式開(kāi)發(fā)系統時(shí),通常大家習慣上將每個(gè)類(lèi)的實(shí)現都存放在一個(gè)單獨的文件里,這樣會(huì )很容易實(shí)現對類(lèi)進(jìn)行復用,同時(shí)將來(lái)維護時(shí)也很便利。這也是OO設計的基本思想之一。在PHP5之前,如果需要使用一個(gè)類(lèi),只需要直接使用include/require將其包含進(jìn)來(lái)即可。下面是一個(gè)實(shí)際的例子:

  /* Person.class.php */

  <?php

  class Person {

  var $name, $age;

  function __construct ($name, $age)

  {

  $this->name = $name;

  $this->age = $age;

  }

  }

  ?>

  /* no_autoload.php */

  <?php

  require_once (”Person.class.php”);

  $person = new Person(”Altair”, 6);

  var_dump ($person);

  ?>

  在這個(gè)例子中,no-autoload.php文件需要使用Person類(lèi),它使用了require_once將其包含,然后就可以直接使用Person類(lèi)來(lái)實(shí)例化一個(gè)對象。

  但隨著(zhù)項目規模的不斷擴大,使用這種方式會(huì )帶來(lái)一些隱含的問(wèn)題:如果一個(gè)PHP文件需要使用很多其它類(lèi),那么就需要很多的require/include語(yǔ)句,這樣有可能會(huì )造成遺漏或者包含進(jìn)不必要的類(lèi)文件。如果大量的文件都需要使用其它的類(lèi),那么要保證每個(gè)文件都包含正確的類(lèi)文件肯定是一個(gè)噩夢(mèng)。

  PHP5為這個(gè)問(wèn)題提供了一個(gè)解決方案,這就是類(lèi)的自動(dòng)裝載(autoload)機制。autoload機制可以使得PHP程序有可能在使用類(lèi)時(shí)才自動(dòng)包含類(lèi)文件,而不是一開(kāi)始就將所有的類(lèi)文件include進(jìn)來(lái),這種機制也稱(chēng)為lazy loading。

  下面是使用autoload機制加載Person類(lèi)的例子:

  /* autoload.php */

  <?php

  function __autoload($classname) {

  require_once ($classname . “class.php”);

  }

  $person = new Person(”Altair”, 6);

  var_dump ($person);

  ?>

  通常PHP5在使用一個(gè)類(lèi)時(shí),如果發(fā)現這個(gè)類(lèi)沒(méi)有加載,就會(huì )自動(dòng)運行__autoload()函數,在這個(gè)函數中我們可以加載需要使用的類(lèi)。在我們這個(gè)簡(jiǎn)單的例子中,我們直接將類(lèi)名加上擴展名”.class.php”構成了類(lèi)文件名,然后使用require_once將其加載。從這個(gè)例子中,我們可以看出autoload至少要做三件事情,第一件事是根據類(lèi)名確定類(lèi)文件名,第二件事是確定類(lèi)文件所在的磁盤(pán)路徑(在我們的例子是最簡(jiǎn)單的情況,類(lèi)與調用它們的PHP程序文件在同一個(gè)文件夾下),第三件事是將類(lèi)從磁盤(pán)文件中加載到系統中。第三步最簡(jiǎn)單,只需要使用include/require即可。要實(shí)現第一步,第二步的功能,必須在開(kāi)發(fā)時(shí)約定類(lèi)名與磁盤(pán)文件的映射方法,只有這樣我們才能根據類(lèi)名找到它對應的磁盤(pán)文件。

  因此,當有大量的類(lèi)文件要包含的時(shí)候,我們只要確定相應的規則,然后在__autoload()函數中,將類(lèi)名與實(shí)際的磁盤(pán)文件對應起來(lái),就可以實(shí)現lazy loading的效果。從這里我們也可以看出__autoload()函數的實(shí)現中最重要的是類(lèi)名與實(shí)際的磁盤(pán)文件映射規則的實(shí)現。

  但現在問(wèn)題來(lái)了,如果在一個(gè)系統的實(shí)現中,如果需要使用很多其它的類(lèi)庫,這些類(lèi)庫可能是由不同的開(kāi)發(fā)人員編寫(xiě)的,其類(lèi)名與實(shí)際的磁盤(pán)文件的映射規則不盡相同。這時(shí)如果要實(shí)現類(lèi)庫文件的自動(dòng)加載,就必須在__autoload()函數中將所有的映射規則全部實(shí)現,這樣的話(huà)__autoload()函數有可能會(huì )非常復雜,甚至無(wú)法實(shí)現。最后可能會(huì )導致__autoload()函數十分臃腫,這時(shí)即便能夠實(shí)現,也會(huì )給將來(lái)的維護和系統效率帶來(lái)很大的負面影響。在這種情況下,難道就沒(méi)有更簡(jiǎn)單清晰的解決辦法了吧?答案當然是:NO! 在看進(jìn)一步的解決方法之前,我們先來(lái)看一下PHP中的autoload機制是如何實(shí)現的。

  (2) PHP的autoload機制的實(shí)現

  實(shí)現自動(dòng)加載,我們需要借助一個(gè)函數來(lái)實(shí)現:

  /*

  autoload_function

  欲注冊的自動(dòng)裝載函數。如果沒(méi)有提供任何參數,則自動(dòng)注冊 autoload 的默認實(shí)現函數spl_autoload()。

  throw

  此參數設置了 autoload_function 無(wú)法成功注冊時(shí), spl_autoload_register()是否拋出異常。

  prepend

  如果是 true,spl_autoload_register() 會(huì )添加函數到隊列之首,而不是隊列尾部。

  */

  bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

  最常用的一種方式就是通過(guò)spl_autoload_register函數來(lái)注冊自動(dòng)加載類(lèi)的方法!

  通過(guò)spl_autoload_register注冊

  我們可以通過(guò)spl_autoload_register函數注冊類(lèi)的方法,在類(lèi)調用前,我們判斷類(lèi)文件路徑是否是文件,如果是則引入之!

  下面是一個(gè)小例子:

  <?php

  class autoload

  {

  publicstatic functionload($className)

  {

  $name = str_replace('\\', '/', $className);

  $fileName = sprintf('%s.php', $name);

  if (is_file($fileName)) {

  require_once $fileName;

  }

  // var_dump($fileName);

  }

  }

  // 這樣寫(xiě)也可以的

  // spl_autoload_register(array("autoload", "load"));

  spl_autoload_register("autoload::load");

  通過(guò)__autoload函數實(shí)現

  我們新建一個(gè)autoload.php文件,里面只放如下代碼也可以實(shí)現上面一樣的功能:

  <?php

  function__autoload($className) {

  $name = str_replace('\\', '/', $className);

  $fileName = sprintf('%s.php', $name);

  if (is_file($fileName)) {

  require_once($fileName);

  }

  }

  小結:自動(dòng)加載可以使得我們的操作更簡(jiǎn)便,經(jīng)常需要自動(dòng)加載一些默認配置,因此掌握自動(dòng)加載的實(shí)現是非常重要的!

【php自動(dòng)加載--autoload()函數用法】相關(guān)文章:

簡(jiǎn)單介紹php構造函數用法08-31

PHP中error-reporting函數用法08-13

php中的字符編碼轉換函數的用法09-10

有關(guān)php parse-str() 函數的定義和用法09-11

關(guān)于php的sprintf函數的用法 控制浮點(diǎn)數格式08-25

PHP的壓縮函數06-21

PHP中substr函數字符串截取用法10-15

淺析php函數的實(shí)例06-08

PHP網(wǎng)絡(luò )操作函數08-26

javascript寫(xiě)的異步加載js文件函數09-28

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频