Yii PHP 프레임 워 크 분석 (3)


  
  
  
  
  1.   Yii PHP  ( ) 
  2.  
  3. :wdy 
  4.  
  5. http://hi.baidu.com/delphiss/blog/item/357663d152c0aa85a1ec9c44.html 
  6.  
  7. Yii Yii ,Yii : 
  8.  
  9. class Yii extends YiiBase 
  10. { 
  11. } 
  12.  
  13. yiic Yii YiiBase “ ”, Yii 。 
  14.  
  15. Yii( YiiBase) “helper class”, 。 
  16.  
  17. Yii : 
  18. $_aliases :   
  19. $_imports :  
  20. $_classes : 
  21. $_includePaths php include paths 
  22. $_app : CWebApplication ,  Yii::app()   
  23. $_logger :   
  24.  
  25. $_app   Yii::createWebApplication()  。 
  26.  
  27.  
  28.  
  29. Yii php5 autoload ,  YiiBase autoload()。 
  30.  
  31. new ,php , include。 
  32.  
  33. autoload “ ”, include 。 
  34.  
  35. YiiBase $_coreClasses  Yii 。 Yii Yii::import()  ,Yii::import() $_classes , * php include_path 。 Yii::import() $_imports , 。 
  36.  
  37. /* Yii::import() 
  38. * $alias:   
  39. * $forceInclude false: include ,true include  
  40. */ 
  41. public static function import($alias,$forceInclude=false) 
  42. { 
  43.    //  $alias YiiBase::$_imports[]  , return,  import。 
  44.    if(isset(self::$_imports[$alias])) // previously imported 
  45.     return self::$_imports[$alias]; 
  46.    // $alias , $_imports[],  
  47.    if(class_exists($alias,false) || interface_exists($alias,false)) 
  48.     return self::$_imports[$alias]=$alias; 
  49.    //  $_coreClasses[] , . , $_imports[],  
  50.    if(isset(self::$_coreClasses[$alias]) || ($pos=strrpos($alias,'.'))===false) // a simple class name 
  51.    { 
  52.     self::$_imports[$alias]=$alias; 
  53.     if($forceInclude) 
  54.     { 
  55.      if(isset(self::$_coreClasses[$alias])) // a core class 
  56.       require(YII_PATH.self::$_coreClasses[$alias]); 
  57.      else 
  58.       require($alias.'.php'); 
  59.     } 
  60.     return $alias; 
  61.    } 
  62.    //   $className, $alias .  
  63.    //  :'x.y.ClassNamer' 
  64.    // $className  '*',  ClassNamer ,      ClassNamer'   $_imports[],  
  65.    if(($className=(string)substr($alias,$pos+1))!=='*' && (class_exists($className,false) || interface_exists($className,false))) 
  66.     return self::$_imports[$alias]=$className; 
  67.    // $alias ,  
  68.    if(($path=self::getPathOfAlias($alias))!==false) 
  69.    { 
  70.     //  * ( ) 
  71.     if($className!=='*') 
  72.     { 
  73.      self::$_imports[$alias]=$className; 
  74.      if($forceInclude) 
  75.       require($path.'.php'); 
  76.      else 
  77.       //  $_classes  
  78.       self::$_classes[$className]=$path.'.php'; 
  79.      return $className; 
  80.     } 
  81.     // $alias 'system.web.*' * , include_path  
  82.     else // a directory 
  83.     { 
  84.      if(self::$_includePaths===null) 
  85.      { 
  86.       self::$_includePaths=array_unique(explode(PATH_SEPARATOR,get_include_path())); 
  87.       if(($pos=array_search('.',self::$_includePaths,true))!==false) 
  88.        unset(self::$_includePaths[$pos]); 
  89.      } 
  90.      array_unshift(self::$_includePaths,$path); 
  91.      set_include_path('.'.PATH_SEPARATOR.implode(PATH_SEPARATOR,self::$_includePaths)); 
  92.      return self::$_imports[$alias]=$path; 
  93.     } 
  94.    } 
  95.    else 
  96.     throw new CException(Yii::t('yii','Alias "{alias}" is invalid. Make sure it points to an existing directory or file.', 
  97.      array('{alias}'=>$alias))); 
  98. } 
  99.  
  100.  YiiBase::autoload()  : 
  101.  
  102. public static function autoload($className) 
  103. { 
  104.    // $_coreClasses  
  105.    if(isset(self::$_coreClasses[$className])) 
  106.     include(YII_PATH.self::$_coreClasses[$className]); 
  107.    // $_classes   
  108.    else if(isset(self::$_classes[$className])) 
  109.     include(self::$_classes[$className]); 
  110.    else 
  111.    { 
  112.     //   include_path  , $className.'.php'  
  113.     include($className.'.php'); 
  114.     return class_exists($className,false) || interface_exists($className,false); 
  115.    } 
  116.    return true; 
  117. } 
  118.  
  119.  import  。  Yii::import()  。 
  120.  
  121.  
  122.  
  123. Yii CComponent 、 、 ,  CComponent CModule (application components) 。 
  124.  
  125. IApplicationComponen ,  init() getIsInitialized() 。init() 。 
  126.  
  127. Yii ,  Yii::app()->user, Yii::app()->request  。 。 
  128.  
  129.  Yii::app()  (CWebApplication) ,CModule , 、 、 。 
  130.  
  131. , CModule __get()  。 
  132.  
  133. CModule $_components[]  ($name => $object),$_componentConfig[]  。 
  134.  
  135. , $_componentConfig , ,CModule , init() 。 
  136.  
  137. Yii::app() CWebApplication  CApplication :urlManager, request, session, assetManager, user, themeManager, authManager, clientScript, coreMessages, db, messages, errorHandler, securityManager, statePersister。 
  138.  
  139. components 。 
  140.  
  141. CModule ,  Yii::createComponent()  。 
  142.  
  143. createComponent() $config  。 
  144.  
  145.  
  146.  
  147. $config (config/main.php ) components : 
  148.  
  149. // application components 
  150. 'components'=>array( 
  151.    'log'=>array( 
  152.     'class'=>'CLogRouter', 
  153.     'routes'=>array( 
  154.      array( 
  155.       'class'=>'CFileLogRoute', 
  156.       'levels'=>'error, warning', 
  157.      ), 
  158.     ), 
  159.    ), 
  160.    'user'=>array( 
  161.     // enable cookie-based authentication 
  162.     'allowAutoLogin'=>true, 
  163.    ), 
  164. ), 
  165.  
  166. $config components CApplication : 
  167.  
  168. $this->configure($config); 
  169.  
  170. configure() : 
  171.  
  172. public function configure($config) 
  173. { 
  174.    if(is_array($config)) 
  175.    { 
  176.     foreach($config as $key=>$value) 
  177.      $this->$key=$value; 
  178.    } 
  179. } 
  180.  
  181. $config $_app setXXX() , 'components’ CWebApplication CModule setComponents() 。 
  182.  
  183. setComponents()  'components’  $_componentConfig[] : 
  184.  
  185. public function setComponents($components) 
  186. { 
  187.    // $config  ’components’  
  188.    foreach($components as $id=>$component) 
  189.    { 
  190.     if($component instanceof IApplicationComponent) 
  191.      $this->setComponent($id,$component); 
  192.     // $_componentConfig , $component 
  193.     else if(isset($this->_componentConfig[$id])) 
  194.      $this->_componentConfig[$id]=CMap::mergeArray($this->_componentConfig[$id],$component); 
  195.     //  $_componentConfig  
  196.     else 
  197.      $this->_componentConfig[$id]=$component; 
  198.    } 
  199. } 
  200.  
  201.  
  202.  
  203.  
  204. CModule CComponent __get() , 。 
  205.  
  206. public function __get($name) 
  207. { 
  208.    if($this->hasComponent($name)) 
  209.     return $this->getComponent($name); 
  210.    else 
  211.     return parent::__get($name); 
  212. } 
  213.  
  214. hasComponent()  $_components[] , $_componentConfig[] 。 
  215.  
  216. public function hasComponent($id) 
  217. { 
  218.    return isset($this->_components[$id]) || isset($this->_componentConfig[$id]); 
  219. } 
  220.  
  221. getComponent()  $_components[] , 。 
  222. $_componentConfig[]  Yii::createComponent()  , $_components[] 。 
  223.  
  224. public function getComponent($id,$createIfNull=true) 
  225. { 
  226.    if(isset($this->_components[$id])) 
  227.     return $this->_components[$id]; 
  228.    else if(isset($this->_componentConfig[$id]) && $createIfNull) 
  229.    { 
  230.     $config=$this->_componentConfig[$id]; 
  231.     unset($this->_componentConfig[$id]); 
  232.     if(!isset($config['enabled']) || $config['enabled']) 
  233.     { 
  234.      Yii::trace("Loading \"$id\" application component",'system.web.CModule'); 
  235.      unset($config['enabled']); 
  236.      $component=Yii::createComponent($config); 
  237.      $component->init(); 
  238.      return $this->_components[$id]=$component; 
  239.     } 
  240.    } 
  241. } 
  242.  
  243.  
  244.  
  245. Yii::createComponent()   
  246.  
  247. public static function createComponent($config) 
  248. { 
  249.    if(is_string($config)) 
  250.    { 
  251.     $type=$config; 
  252.     $config=array(); 
  253.    } 
  254.    else if(isset($config['class'])) 
  255.    { 
  256.     $type=$config['class']; 
  257.     unset($config['class']); 
  258.    } 
  259.    else 
  260.     throw new CException(Yii::t('yii','Object configuration must be an array containing a "class" element.')); 
  261.  
  262.    if(!class_exists($type,false)) 
  263.     $type=Yii::import($type,true); 
  264.  
  265.    if(($n=func_num_args())>1) 
  266.    { 
  267.     $args=func_get_args(); 
  268.     if($n===2) 
  269.      $object=new $type($args[1]); 
  270.     else if($n===3) 
  271.      $object=new $type($args[1],$args[2]); 
  272.     else if($n===4) 
  273.      $object=new $type($args[1],$args[2],$args[3]); 
  274.     else 
  275.     { 
  276.      unset($args[0]); 
  277.      $class=new ReflectionClass($type); 
  278.      // Note: ReflectionClass::newInstanceArgs() is available for PHP 5.1.3+ 
  279.      // $object=$class->newInstanceArgs($args); 
  280.      $object=call_user_func_array(array($class,'newInstance'),$args); 
  281.     } 
  282.    } 
  283.    else 
  284.     $object=new $type; 
  285.  
  286.    foreach($config as $key=>$value) 
  287.     $object->$key=$value; 
  288.  
  289.    return $object; 
  290. } 

좋은 웹페이지 즐겨찾기