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

Pavkatar

Registered
Здравейте, как мога да накарам променливата $this в 1 клас да наследи всички обекти, прменливи и методи на всички класове наследили базовия клас (Ядро) :?
 
Не знам какво точно искаш да направиш но предполагам че е това:

Код:
class SomeClass
{ 
	    private $name; 
	    private $price; 
	    private $photo; 
	    private $description; 
	     
	    public function SomeClass() {} 
	     
	    protected function setName($name) { $this->name = $name; } 
	    public function GetName() { return $this->name; } 
	     
	    protected function setPrice($price = '0.00') { $this->price = $price; } 
	    public function GetPrice() { return $this->price; } 
	     
	    protected function setPhoto($photo) { $this->photo = $photo; } 
	    public function GetPhoto() { return $this->photo; } 
	     
	    protected function setDescription($description) { $this->description = $description; } 
	    public function GetDescription() { return $this->description; } 
	     
}

И после просто го продължаваш по следния начин

class OtherClass extends SomeClass
{
private $model;

public function Car($name, $model, $price, $photo, $description)
{
parent::setName($name);
$this->setModel($model);
parent::setPrice($price);
parent::setPhoto($photo);
parent::setDescription($description);
}

private function setModel($model) { $this->model = $model; }
public function GetModel() { return $this->model; }

}

extends
 
Ммм май няма да е това. Идеята е да е нещо както в фреимуорковете. Примерно: $this->db->ne6tosi, $this->session->fdsf, $this->load->lfsfsd

Тоест всичко е достъпно от "$this" :idea:
 
Оф бях гледал точно това, което ти искаш, но го позабравих и не мога да се сетя къде го гледах.
Опитай следното, но си нямам и на идея дали би работило на практика:
$this->db = new db_class();
$this->db->variable_from_db_class;
 
Ами аз правя нещо такова, но не баш:
Пример
Код:
$CORE =& $SI->getInstance("CORE");

$CORE->loader =& $SI->getInstance('loader');
Но после не са достъпни от $this в класа CORE
 
Гледам май, че си тръгнал да правиш framework като гледаш от CI :). Това, което търсиш по мое мнение се намира в Codeigniter/Base4.php и Codeigniter/Base5.php :?:

После контролер класа ти наследява Base класа и след това като направиш собствен контролер той от своя страна наследява контролер класа и така има достъп до глобалното this :)

Също мисля, че не е зле да видиш Codeigniter/Common.php и по-точно load_class() метода :)

Поразгледай внимателно файловете на CI като започнеш от index.php и при всеки вкаран файл се местиш на него и преглеждаш неговия сорс :)
 
Ползвай си статични класове вместо това. Много по-удобно ще ти е и имаш intellisense.

CI е направен да е съвместим с PHP4 и затова повечето PHP5 OOP неща не са използвани.
 
Код:
class test1 {

    private static $view;

    private static $register  = null;
 
    public function getInstante() {
         if(self::$register == null) {
               self::$register = new self();
         }
          return self::$register;
    }

    public function setView($view) {
         self::$view = $view;
    }

    public function getView() {
         return self::$view;
    }
}


class test2 {
   public $t = 12345;
}

$t = test1::getInstante()->setView(new test2());
var_dump(test1::getView());
 
В момента и аз си губя времето като пиша фреймуърк, подобен на CI.
Във CI във функцията load_class има статичен масив $objects (примерно) и този масив съдържа инстанциите на всички класове, които искаш да се използват през $this.
Код:
function load_class( $class ){
    static $objects = array();
    
    if( isSet($objects[$index]) )
        return $objects[$index]; //връща инстанцията на класа

    // надолу ти е кода за инстанцииране на класа 
}
След това в класа Controller, който унаследяват всички контролери има следната структура:
Код:
Class Controller{

    public function __get( $index ){
        return load_class( $index );
    }
}
Аз съм го направил по малко по-различен начин, но принципа е същият :)
 
Аз си ползвам Multiton и нямам проблем... всяка инстанция като отделна променлива и всичко си ми е точно.
 
Мерси много за отговорите, ще ги пробвам нещата :) И ще пиша :) Иначе това с multyton-a си използва някаква друга библиотека, от която няма смисъл :) И май няма да го използвам. Но ще пиша по-подробно по-късно ;) Иначе да правя си FW-кче, но ще го правя с HMVC, че ми е по-подредено :)
 
Каква друга библиотека те гони пък тебе. Това си един клас, който взима аргументи на отделни класове и си ги прави като нови инстации в различни променливи.

Base.php
Код:
interface Singleton {}
interface Multiton {}

class Base
{
	static $singletons = array();
	static $multitons = array();

	static function get($class_name)
	{
		if (isset(Base::$singletons[$class_name])){
			return Base::$singletons[$class_name];
		}

		$construct_params = func_get_args();
		array_shift($construct_params);

		if(isset(Base::$multitons[$class_name])){
			return Base::$multitons[$class_name]/*[$multiton_param_processed]*/;
		}

		$reflection = new ReflectionClass($class_name);

		if (null === $reflection->getConstructor()){
			$new_instance = $reflection->newInstance();
		}
		else{
			$new_instance = $reflection->newInstanceArgs($construct_params);
		}

		if ($reflection->isSubclassOf('Singleton')){
			return Base::$singletons[$class_name] = $new_instance;
		}

		if ($reflection->isSubclassOf('Multiton')){
			/*if (!isset($multiton_param_processed)){
				$multiton_param_processed = call_user_func_array(array($class_name, 'getFace'), $construct_params);
			}*/
			return Base::$multitons[$class_name]/*[$multiton_param_processed]*/ = $new_instance;
		}
		return $new_instance;
	}
}

index.php
Код:
require_once "Base.php";

$DB = Base::get('Database', 'DBHOST', 'DBUSER', 'DBPASS', 'DBNAME');
$DB->connect();

Database.php
Код:
class Database implements Multiton
{
	private $_HOST, $_USER, $_PASS, $_DB, $_link;
	
	public function __construct($host, $user, $pass, $db)
	{
		$this->_HOST = $host;
		$this->_USER = $user;
		$this->_PASS = $pass;
		$this->_DB = $db;
	}
	
	private function connect()
	{
		$this->_link = mysql_connect($this->_HOST, $this->_USER, $this->_PASS);
		if(!$this->_link){
			die(mysql_error($this->_link));
		} else {
			mysql_select_db($this->_DB, $this->_link);
		}
		
	}

Е това ти е цялата философия... За connect можеш да ръгнеш функцията в конструктора ($this->connect() ) и да я махнеш от индекс ($DB->connect()).
И така също можеш да си правиш най-различни инстанции
Примерно за странициране

Код:
$PG = Base::get('Pagination');
//и от там
$PG->show(); //или там както си си направил функциите

Само не забравяй на всеки клас да имплементираш интерфейс Multiton както съм показал за Database.
 
Сигурно говори за Reflection_class :)
Той е от базовите класовете на PHP.
Според мен няма нужда да се използва защото може да се направи и по следният по-прост начин:
Код:
$class = 'some_class';
$inst = new $clsss();
Но не знам от коя версия на PHP се поддържа този синтаксис.
 
Ако искаш да присвоиш клас в $this просто му направи инстанция в този клас.

Пример
Код:
class Example1 {
 public $var;
 public function setvar($v) {
       $this->var = $v;
 }
}

class PrimeClass {
 public $instanceEx1 = null;
 public $some;
 public $someother;

 function __construct() {
     $this->instanceEx1 = new Example();
 }

 function Ne6tosi() {
   .....
    $this->instanceEx1->setvar(10);
   .....
 }
}

сега

$c = new PrimeClass();

$c->instanceEx1->setvar(5);
 
F1r3Fl3x каза:
Сигурно говори за Reflection_class :)
Той е от базовите класовете на PHP.
Според мен няма нужда да се използва защото може да се направи и по следният по-прост начин:
Код:
$class = 'some_class';
$inst = new $clsss();
Но не знам от коя версия на PHP се поддържа този синтаксис.


Така ще получи Singleton и според мен няма да му свърши работа, защото той иска да управлява няколко инстанции, чрез една променлива или по-точно нещо от този род

Код:
$IN->име-на-клас->функция/променлива
 
Не си ме разбрал @relax15pyt :)
Имах предвид нещо от сорта:
Код:
class Base {
private $objects = array();
public function addLib( $name ){
    include( "libs/{$name}.class.php" ); //Зареждаме файла с класа
    $this -> objects[$name] = new $name(); //добавяме инстанцията към главния масив
    return $this -> objects[$name]; //връщаме инстанцията на обекта
}

public function __get( $index ){
    if( isSet($this -> objects[$index]) )
        return $this -> objects[$index];
    else
          return false;
}
}
И ето как ще работи
Код:
$base = new Base; 
$base -> addLib( 'session' ); // Зарежда файла libs/session.class.php и инстанциира клас session
// Чрез магическата функция __get имаме достъп до инстанцията на класа чрез $base -> session
$base -> session -> start();
Просто е по-удобно инстанциите да са в масив, а не пръснати като променливи в самия клас. По-лесно се работи с тях, като са в масив :)
 
F1r3Fl3x каза:
Не си ме разбрал @relax15pyt :)
Имах предвид нещо от сорта:
Код:
class Base {
private $objects = array();
public function addLib( $name ){
    include( "libs/{$name}.class.php" ); //Зареждаме файла с класа
    $this -> objects[$name] = new $name(); //добавяме инстанцията към главния масив
    return $this -> objects[$name]; //връщаме инстанцията на обекта
}

public function __get( $index ){
    if( isSet($this -> objects[$index]) )
        return $this -> objects[$index];
    else
          return false;
}
}
И ето как ще работи
Код:
$base = new Base; 
$base -> addLib( 'session' ); // Зарежда файла libs/session.class.php и инстанциира клас session
// Чрез магическата функция __get имаме достъп до инстанцията на класа чрез $base -> session
$base -> session -> start();
Просто е по-удобно инстанциите да са в масив, а не пръснати като променливи в самия клас. По-лесно се работи с тях, като са в масив :)

Ахъм... сега разбрах ;)
 

Back
Горе