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

좋은 웹페이지 즐겨찾기