how does the components not in the core get instanced (be an object)

suppose i have a config file containing the following array items:







in the config file, and Haha is class inherited from CApplicationComponent

(class Haha extends CApplicationComponent);


$app->haha->dosomething(); // from here we know that $app->haha is already an instance of Haha,

                       // and call dosomthing();


i just wonder how class Haha get instanced in the source code;

in source code, i found

public function configure($config)




		foreach($config as $key=>$value)




the above code is actually read config array in and made it index a property of the class and with the value the value of the array itself.


 * Loads static application components.


protected function preloadComponents()


	foreach($this->preload as $id)



and this above code i found the $this->preload array has nothing to do with the config array, in souce code, it actually empty when declared at the class beginning, so how $this->getComponent($id) get called ?!

so, at the end, so how the customized components get instanced? I know, it actually get instanced, I just wonder how that get done in source code. Can somebody help?

anybody help?

anybody help?

It’s done via autoloading. When PHP is about to fail to load a class it starts calling SPL autoloaders. One that Yii uses is

as the following, i got it; magic function __get does the trick first, and then autoload. In single file, structure like the following:

class A{

public static function run(){

    return new B();



class B{

public function __get($name){

return new $name();



class haha{

public function dosth(){

echo 'asdf';



$app = A::run();

$app->haha->dosth(); // asdf to screen here.