prestashop更新1.4后,,系統(tǒng)文件結構發(fā)生比較大的變化,,
其中一項就是關于核心類的定義變化,,以前在1.4以前,,在classes目錄下,,定義的類,,都是以class Address{}
這樣的類型存在,,而今,,在classes目錄下,,定義的核心類,則都是以Core結尾,,比如原來的Address 類,,變成了 AddressCore類,
但是,,為什么在我們使用時候,,卻依然可以直接
- $address = new Address();
復制代碼
這樣來調用呢,那么,,請看完小蝦今天的PS解說之__autoload(),培析PS如何載入類.
文件路徑: config/autoload.php
- function __autoload($className)
- {
- //如果smarty自動載入函數(shù)存在,,且這個類為smarty本身的類或者smarty的插件類,則直接返回true
- //詳情可查看smartyAutoload 這個函數(shù)的過程
- if (function_exists('smartyAutoload') AND smartyAutoload($className))
- return true;
- //替換類名的空格 ,,char(0) ASSIC碼中字符表示空格,,代碼表示為null
- $className = str_replace(chr(0), '', $className);
- //定義基類目錄
- $classDir = dirname(__FILE__).'/../classes/';
- //定義擴張類目錄
- $overrideDir = dirname(__FILE__).'/../override/classes/';
- //判斷擴張文件是否存在
- $file_in_override = file_exists($overrideDir.$className.'.php');
- //判斷基類文件是否存在
- $file_in_classes = file_exists($classDir.$className.'.php');
- //如果類名最后4位為Core,則直接導入這個基類類文件
- //比如,你可直接 實例 new OrderCore();
- if (substr($className, -4) == 'Core')
- require_once($classDir.substr($className, 0, -4).'.php');
- else
- {
- //如是擴張文件和基類文件都存在,,那么同時導入這兩個文件,。
- if ($file_in_override && $file_in_classes)
- {
- require_once($classDir.str_replace(chr(0), '', $className).'.php');
- require_once($overrideDir.$className.'.php');
- }//如果擴張文件不存在,只存在基類文件則
- elseif (!$file_in_override && $file_in_classes)
- {
- //導入基類文件
- require_once($classDir.str_replace(chr(0), '', $className).'.php');
- //獲取基類文件的反射API信息
- //interface_exists($className, false) or class_exists($className, false)) ? '' : 'Core')
- //上面這一句,,接口是否存在,,或者類存在,也就是classes目錄下,,可直接定義類名為 classes Myfoo{},,如果條件為true,則為空,否則 在類名后面添加一個Core
- //也就是 $classInfos = new ReflectionClass($className.'Core');
- $classInfos = new ReflectionClass($className.((interface_exists($className, false) or class_exists($className, false)) ? '' : 'Core'));
- //如果這不一個接口,而且最后類名最后4位為Core,則執(zhí)行
- //($classInfos->isAbstract() ? 'abstract ' : '').'class '.$className.' extends '.$className.'Core {}'
- //類是否為一個抽象類,,如果,,則聲明一個臨時的抽象類 abstract class $className extends $className.'Core' {}
- //eval執(zhí)行這段字符串
- if (!$classInfos->isInterface() && substr($classInfos->name, -4) == 'Core')
- eval(($classInfos->isAbstract() ? 'abstract ' : '').'class '.$className.' extends '.$className.'Core {}');
- }//如果只存在擴張類,不存在基類,,那么,,直接導入擴展類
- elseif ($file_in_override && !$file_in_classes)
- require_once($overrideDir.$className.'.php');
- }
- }
復制代碼
|