Вопросы по ООП в PHP

1.8K
.
Привет всем)
Вкурсе можно ли обращатся к переменной экземпляра из статического метода класса?
Например:
<?php
class vasija
        {
            protected $person = false;
            public static function set_person()
            {
                $this->person=true;
            }
            public static function get_person()
            {
                return $this->person;
            }
        }
?>

Можно ли сделать так, или обязательно использовать self, parent, static?
Зарание Вам благодарен)
.
Ja_Kazanova, как вариант через селф попробовать а так при обращении из статического метода вроде как ошибку должно выбивать
.
Ja_Kazanova (23.09.2012/12:02)
можно ли обращатся к переменной экземпляра из статического метода класса?
Нет. Слой класса отличен от слоя экземпляра. Это как обращаться к свойству одного объекта из другого
.
Я уже понял. Получить - можно, изменить - нет
.
Ни получить, ни изменить нельзя
.
Помогите пожалуйста) Возникла проблемка. При использовании шаблонизатора выдает ошибки:
Notice: Use of undefined constant self - assumed 'self' in /var/www/s4_1570/data/www/amfeon.ru/includes/classes/template.php on line 19

Fatal error: Call to a member function assign() on a non-object in /var/www/s4_1570/data/www/amfeon.ru/modules/index/index.php on line 11

Класс шаблонизатора наследует класс Регистри. Вот шаблонизатор:
<?php

/**
 * @author Folour aka XeOn (SkyFire)
 * @project FoEngine
 * @contacts ICQ: 2666440, MAIL: Folour@i.ua
 * @copyright Folour Technologies, (c) 2012
 */
class Template extends Registry {
	
	protected static $tplExt = '.php';
	protected static $templates = array();
	
	public function __construct() {}
	public function __clone() {}
	
	public static function assign($name, $value) {
		parent::$storage[$name] = $value;
		return self;
	}
	
	public static function setTemplate ($tpl) {
		if(!isset($tpl))
			exit('Tpl name not set');
		self::$templates[] = ROOT . 'modules' . DSEP . MODULE . DSEP . 'templates' . DSEP . $tpl . self::$tplExt;
		return self;
	}
	
	public static function render ($exit = false) {
		//extract(parent::$storage, EXTR_PREFIX_ALL, '');
		if(!empty(self::$templates[0])) {
			foreach (self::$templates as $tpl) {
				if(file_exists($tpl)) {
					echo "\n\t\t<!-- " . basename($tpl) . " begin -->\n";
					require $tpl;
					echo "\n\t\t<!-- " . basename($tpl) . " end -->\n";
				}
				else {
					echo '<div><h1>Template ' . $tpl . ' is missing</h1></div>';
				}
			}
		}
		if($exit) {
			if(file_exists(ROOT . 'style' . DSEP . THEME . DSEP . 'templates' . DSEP . 'footer.php'))
				require ROOT . 'style' . DSEP . THEME . DSEP . 'templates' . DSEP . 'footer.php';
			exit;
		}
	}
}

Вот регистри
<?php

/**
 * @author Folour aka XeOn (SkyFire)
 * @project FoEngine
 * @contacts ICQ: 2666440, MAIL: Folour@i.ua
 * @copyright Folour Technologies, (c) 2012
 */
class Registry {
	protected static $instance = NULL;
	protected static $storage = array();
	
	public static function instance () {
		if(is_null(self::$instance))
			self::$instance = new self;
		//self::$storage['DB'] = new DB(parse_ini_file(INCDIR . 'dbcofig.fdb')));
		self::$instance -> __set('Functions', new Functions);
		self::$instance -> __set('Core', new Core);
		self::$instance -> __set('Tpl', new Template);
		return self::$instance;
	}
	
	public function __set($name, $value) {
		if(!isset(self::$storage[$name]))
			self::$storage[$name] = $value;
		return self::$instance;
	}
	
	public function __get($name) {
		if(isset(self::$storage[$name]))
			return self::$storage[$name];
		return self::$instance;
	}
	
	public function __isset($name) {
		return isset(self::$storage[$name]);
	}
	
	public function __unset($name) {
		unset(self::$storage[$name]);
	}
	
}


А вот как использую шаблонизатор:
<?php

/**
 * @author Folour aka XeOn (SkyFire)
 * @project FoEngine
 * @contacts ICQ: 2666440, MAIL: Folour@i.ua
 * @copyright Folour Technologies, (c) 2012
 */

$Tpl	-> assign('title', 'title')
		-> assign('content', 'content')
		-> setTemplate('content');

А затем в основном контроллере
$Tpl -> render();
.
~XeOn~, Вместо self юзай переменную в которой хранится инстанция объекта.
И вообще не понятно зачем ты наследуешь темплейт от регистри если практически не используешь его?
На мой взгляд более логичнее было выполнить примерно так (Всего лишь пример, не стал доводить до конца, но суть думаю ясна):
<?php
class Registry { 
    protected $_instance = NULL; 
    protected $_storage = array(); 
    
	private function __construct() {
		$this->Functions = new Functions; 
        $this->Core = new Core; 
        $this->Tpl = new Template; 
		//$this->Db = new DB(parse_ini_file(INCDIR . 'dbcofig.fdb')); 
	}
	
    public static function instance () { 
        if(is_null(self::$instance)) 
            $this->_instance = new __CLASS__; 
        return $this->_instance; 
    } 
     
    public function __set($name, $value) { 
        if(!isset($this->_storage[$name])) {
			$this->_storage[$name] = $value; 
			return TRUE;
		}
        return FALSE; 
    } 
     
    public function __get($name) { 
        if(isset($this->_storage[$name])) 
            return $this->_storage[$name]; 
        return NULL; 
    } 
     
    public function __isset($name) { 
        return isset($this->_storage[$name]); 
    } 
     
    public function __unset($name) { 
		if (isset($this->_storage[$name]) {
			unset($this->_storage[$name]);
			return TRUE;
		}
        return FALSE;
    } 
     
}

class Template extends Registry { 
     
    protected $_tplExt = '.php'; 
    protected $_templates = array(); 
	
    public static function setTemplate ($tpl) { 
		try {
			$tpl = ROOT . 'modules' . DSEP . MODULE . DSEP . 'templates' . DSEP . $tpl . $this->_tplExt;
			if (is_file($tpl)) {
				$this->_templates[] = $tpl; 
			} else {
				throw new Exception('Unable to set template "' . $tpl . '" - file is not exists');
			}
		} catch (Exception $e) {
			echo $e->getMessage();
		}
    } 
     
    public static function render ($exit = false) { 
        //extract(parent::$_storage, EXTR_PREFIX_ALL, ''); 
		foreach ($this->_templates as $tpl) { 
			if(file_exists($tpl)) { 
				echo "\n\t\t<!-- " . basename($tpl) . " begin -->\n"; 
				require $tpl; 
				echo "\n\t\t<!-- " . basename($tpl) . " end -->\n"; 
			}
		}
        if($exit) { 
            if(file_exists(ROOT . 'style' . DSEP . THEME . DSEP . 'templates' . DSEP . 'footer.php')) 
                require ROOT . 'style' . DSEP . THEME . DSEP . 'templates' . DSEP . 'footer.php'; 
            exit; 
        } 
    } 
}

$tpl = Template::instance();
$tpl->title = 'title';
$tpl->content = $content;
$tpl->setTemplate('content');	
$tpl->render();
.
Screamer, Спасибо, сейчас сделаю наподобии твоего примера. У меня изначально все классы через instance() вызывались, тоесть синглтон. Но прочитал что это плохой тон и решил переписать, но с наследованием я еще толком не работал вот и начались проблемы. А наследую я регистри потому что в нем будут инициализированы все классы системы, и что-бы не передавать постоянно объект нужного класса в другой класс через конструктор - сделал наследованием. Думаю понял).
.
~XeOn~,
изначально все классы через instance() вызывались, тоесть синглтон. Но прочитал что это плохой тон и решил переписать

И таки переписал всё статично, что вобще не есть ООП.
Так у тебя хоть внутри синглтона был нормальный обьект, а сейчас те же процидуры, только в обёртке класса.

наследую я регистри потому что в нем будут инициализированы все классы системы, и что-бы не передавать постоянно объект нужного класса

Кого передавать? Куда?
У тебя же Registry через синглтон, т.е у тебя идёт получение зависимостей (pull подход) из любого места приложения, посредством обращения к реестру.

Нафига его наследовать, если где угодно можно сделать так:

Registry::instance()->get('SomeObject');
.
L!MP, Я вот не пойму, синглтон это плохо или хорошо? гг
http://habrahabr.ru/post/113418/ вот тут статья про то как сделать наследование синглтона, что-бы в кажном классе не задавать функцию getInstance() но в комментах обсираю синглтон, типа быдлокод. Если это быдлокод то зачем его ввели в пхп?
Всего: 383