Доступ к свойству класса, из другого класса

KukPHP

Новичок
Доступ к свойству класса, из другого класса

Есть такой код:
PHP:
<?php
class A {
    public $log = "1";    
    public function set_log($name) {
        $this->log = $name;
    return TRUE;
    }
}
class b {
    public function add_var($name) {
        $class = new A;
        $class->set_log($name);
    return TRUE;
    }
}

$b = new b;
$a = new A;
$b->add_var("2");
echo $a->log; 
?>
Суть проста - нужно из метода одного класса изменить свойство другого класса. (ипользую PHP5).
Если использовать так - изменения не будет (ну это и логично, ведь присвавывается не $a, a $class. Как быть
(Может както через ссылки. я не знаю..)
 

HraKK

Мудак
Команда форума
Передевайте в B указатель на класс A, либо получайте в классе B уже существующий экземпляр класса A (например синглтон).
 

KukPHP

Новичок
2Mr_Max - отличается. там была мистика - тут уже все ясно. скрипт тот же, вопрос немножко другой.
2HraKK наконецто до меня доперло, причем здесь синглтон.

Пасибо. буду юзать
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
до меня доперло, причем здесь синглтон.
Ну наконец=то, дошло. А могло дойти ещё вчера.

HraKK
ты "контрольный" сделал. :)
 

KukPHP

Новичок
у мну наверн руки из не из плечевого сустава ростут...
Написал такой код
PHP:
<?php
class A {
    public $log = "1";    
    public function set_log($name) {
        $this->log = $name;
	echo $this->log." _ "; //показывает 2
    return TRUE;
    }
    public function instance() {
	$class = new A;    
	return $class;
    }
}
class b {
    public function add_var($name) {
        $class = A::instance();
        $class->set_log($name);
	echo $class->log." _ "; //показывает 2
    return TRUE;
    }
}

$b = new b;
$a = new A;
$b->add_var("2");
echo $a->log; //а тут все равно показывает 1
?>
и даже если делать ссылку (ставлю public function &instance() { и $class =& A::instance();) все равно результат прежний..
Передавать в качестве аргумента указатель А не подходит..
 

HraKK

Мудак
Команда форума
Гугл - > Singleton
У тебя не синглтон а х-я какая-то.
 

KukPHP

Новичок
function &getInstance (){
static $instance;
if (!isset($instance)) {
$cl = __CLASS__;
$instance = new $cl();
} // if
return $instance;
}
Вот надыбал статью про синглтон. Там приведен такой код. вызывается так = $a = & a::getInstance();. Не работает

-~{}~ 19.10.07 13:29:

И даже с википедии код
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new A;
}
return self::$instance;
}

Не работает...
 

HraKK

Мудак
Команда форума
Покажи весь код с таким
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new A;
}
return self::$instance;
}
Сингтоном.

И вообще подучи что в пхп5 все обьекты передаются по ссылке, по умолчанию(zObj).

-~{}~ 19.10.07 13:33:

И синглтон не надо унитилизировать.
 

KukPHP

Новичок
ААаа. я дебил...нужно было изменить строчку $a = new A; на $a = A::getInstance();...все работает. пасиб, помогли...

-~{}~ 19.10.07 13:39:

<?php
class A {
public $log = "1";
private static $instance;
public function set_log($name) {
$this->log = $name;
echo $this->log." _ ";
return TRUE;
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new A;
}
return self::$instance;
}
}
class b {
public function add_var($name) {
$class = A::getInstance();
$class->set_log($name);
echo $class->log." _ ";
return TRUE;
}
}

$b = new b;
$a = A::getInstance();
$b->add_var("2");
echo $a->log;
?>

конечный код. мож комуто нада

-~{}~ 19.10.07 22:50:

чтобы не постить тему - запустю сюда...
Ситуация таже. Эти же два класса. и нужно в каждом класе иметь указать на другой класс. ссылку с первого на второй я сделал в __construct - $this->b_class = new b;
Ccылку с второго на первый пытаюсь сделать через синглтон (который я прописал в первом классе) - тоже через констракт - $а_class = А::getInstance().
И тут у меня скрипт непонятно почему аварийно завершается (Огнелис предлагает мне скачать этот файл. Если же строчку закомментировать - будет хорошо...добавил в начало функции __construct() две строчки: echo "А";flush();.
При запуске скрипта в браузер выводится ну просто огромное число символов А (какойто цикл получается). Если же присваивать на функции констракт ,а в другой какойто (как в старом примере, я присваивал в функцие add_var(), то все нормально. Незнаю, чем это вызвано..

Подумываю, чтобы сделать эти класы через наследования, или вобще слить в один класс, но думаю, будет ли это семантически правильно?

-~{}~ 20.10.07 00:05:

ответьте ктото плиз
 

KukPHP

Новичок
НУ если бы я запостил бы в новую тему и такое сказал - да. меня можно было б упрекать. Но тут 10-15 постов об этом говорили, и я задал немножко иной вопрос по тому же коду - то тут нет ничего непонятного
 

HraKK

Мудак
Команда форума
У тебя идет зацикливание класс А указывает на Б который указывает на А который указывает на Б....

Почитай умные книги по ООП.
 

KukPHP

Новичок
ну зацыкливание есть. не спорю. но: зацикливание без проблем создается, но потом не удаляется (или удаляется неправильно), и почему же с другой функции создается указатель, а с констракта - нет.
З.Ы. Читал книгу Котерова "PHP5". Может все таки через наследование рубануть, и забить на семантику?
 

HraKK

Мудак
Команда форума
Не пиши пока на ООП, дорастешь сам поймешь что надо делать.
ЗЫ Лучше Гради Буч или Фаулер.
 

KukPHP

Новичок
это автора??
Но я хочу полноценно писать на ООП, и ждать, поко оно само "придет" не собираюсь.
 

HraKK

Мудак
Команда форума
ну звиняйте, полность учить тебя ООП ни я ни кто либо другой не собираются.

Хочешь - пиши.
 

KukPHP

Новичок
я и не прошу. просто интересно поведение скрипта, когда создаешь указатель в констракте.если же вызывать не синглтон, а чтото другое, то все норм. или же если вызывать синглтон не в констракте, а в другом методе класа - тоже все норм.
 

Major

Новичок
KukPHP

ООП нужен, если ты реально понимаешь как его использовать. Это не просто тупо конуструкции язка, повзоляющие писать не просто, а сложно. Для начала ты вот ответь, можешь ли ты описать свою систему используя теорию ООП ? Ты можешь просто расписать свой проект, используя такие термины как объекты, сущности, описать взаимосвязь между ними. Про UML знаешь что-нибудь? Можешь спроектировать свой проект используя UML ? Или для тебя ООП это тупо вот есть класс, вот я в него напихал всякого, а зачем я так сделал я не знаю, но прикольно? Не готов ты для ООП. Особенно вспоминая 1ю твою тему с заголовком "Мистика (массивы в классе)". Для тебя ООП пока мистика и не более.

Но я хочу полноценно писать на ООП, и ждать, поко оно само "придет" не собираюсь.
Ты только что сам доказал еще раз что ты не просто не готов писатьна ООП. Что значит ждать не собираюсь? Ну прикажи себе. Как в фильме "матрица", скажи: Тенк, хочу знать ООП и баста. А для полного эффекта топни ногой и ударь рукой по столу, авось и правда вся система подчинится тебе.
 
Сверху