$this да наследи обектите от предишия клас

Tази тема доста ме заинтересува.... някой ще може ли да ми го обясни бавно и разбираемо, все едно го обяснява на баба си , щот нищо не разбрах :D//не се базикам
 
Ами виж на @F1r3Fl3x скрипта. Проследи го внимателно и виж какво точно прави __get() функцията и как се използва и тогава, ако не ти стане ясно ще се опитам да ти обясня с примери.
 
В общи лини @Pavkatar иска да си направи собстен фреймуърк, подобен на CI. И пита как може да направи достъпа до хелпър класовете да се извърши чрез $this -> class_name в контролерите.
И номерът е следният. Понеже 2 класа ще имат нужда от достъп до тези хелпър класове, а тези калсове са Controller и Model, инстанциите на хелпър класовете трябва да са събрани на едно място, за да няма излишна консумация на ресурси, и това място е класът Base.
Код:
class Base {
private static $objects = array();
public function addLib( $name ){
    include( "libs/{$name}.class.php" ); //Зареждаме файла с класа
    self::$objects[$name] = new $name(); //добавяме инстанцията към главния масив
    return self::$objects[$name]; //връщаме инстанцията на обекта
}

public function hasLib( $index ){ return isSet( self::$objects[$index]; }

public function getLib( $index ){
    if( $this -> hasLib($index) )
        return self::$objects[$index];
    else
        return false;
}
}

След това класа Controller, маркиран е като абстрактен, за да не може да се инстанциира, и метода index е абстрактен, защото всички дъщерни класове трябва да съдържат такава функция, иначе PHP ще даде грешка.
Код:
abstract class Controller{
    public function __get( $index ){
        $base = new Base();
        return $base -> hasLib( $index );
    }
    abstract public function index();
}

Класът Model е същият, освен че не трябва да има абстрактен клас index :)

Код:
И ето как ще работи:
class test extends Controller{
    public function index(){ // без нея, PHP ще извади грешка
        $this -> image -> rotate('90');
        $this -> image -> show();
    }
}

// Като преди това библиотеката image е заредена по следният начин:
// $base = new Base();
// $base -> addLib( 'image' );
// :)

И аз се борих известно време с тази концепция, защото и аз си правя фреймуърк. Това е начина, който аз ползвам. Дано да ти е станало ясно @Index, защото по-добре не мога да го обясня :)
 
Даже няма да е зле скрипта на @F1r3Fl3x да се модифицира и да може на addLib да се слага направо масив, така по-лесно и кратко ще е инстанцирането.
 

Back
Горе