Мистика (масив в классе)

KukPHP

Новичок
Мистика (масив в классе)

Есть у меня класс. в нем есть переменная $log, которая описана так: private $log; (пишу под PHP 5).
И есть функция в этом же классе:
public function set_log($name,$value) {
if($this->log[$name] = $value) {print_r($this->log);}
return TRUE;
}
Функция должна делать элемент масива $log с ключом $name и значением $value. Показания print_r($his->log) показывает, что присваивания происходит. Но за пределами функции масив $log не меняется. Какие я уже способы не пробовал - все равно так. не понимаю...
 

Major

Новичок
Но за пределами функции масив $log не меняется. Какие я уже способы не пробовал
а толковее можно вопрос задать? Чтозначит за пределами? Где это видно?

-~{}~ 19.10.07 01:21:

Во 2х очень интересный способ отладки

if($this->log[$name] = $value) {print_r($this->log);}
 

KukPHP

Новичок
Без if тоже не работает. просто проверил, что действительно присваивается элемент массива...

вот к примеру..
есть у нас переменная (зададим ей какойто элемент масива)
private $log = array("a"=>"b");
потом вызовем верхнуюю функцию с параметрами $this->set_log("c","b"); Сообщение функции напишет нам, что $this->log содержит два элемента, но если потом еще читать эту переменную ,к примеру из другой функции этого класса - то на самом деле там только один элемент (тот, который мы задавали явно)...
Сейчас я напишу упрощенный код, который продемонстрирует эту особенность...
 

Major

Новичок
Показания print_r($his->log) показывает, что присваивания происходит.
если я сделаю так

PHP:
$obj->set_log('a', 0)
// или
$obj->set_log('a', false)
то ты скажешь что присваивания не произошло?

Мне кажется что я догадваюсь что ты имеешь в виду, но тут не гадалки. Толком объясни что ты делаешь и покажи как...

З.Ы.:Я тут пока мистики вообще не увидел, только ерунду какую-то.
 

Major

Новичок
Он не недоговаривает. Он похоуд сам не понял логику своего скрипта, а словами объяснить не может... Откуда он вызывает set_log() и где он потом проверяет свой массив? Бред какой-то...
 

KukPHP

Новичок
Вот упрощенный код.
PHP:
<?php
class A {
	public $log = array('a'=>'b');	
	public function set_log($name,$value) {
		$this->log[$name] = $value;
	return TRUE;
	}
}
class b {
	public function add_var($name,$value) {
		$class = new A;
		$class->set_log($name,$value);
	return TRUE;
	}
}

$b = new b;
$a = new A;
$b->add_var("c","d");
print_r($a->log);
?>
результатом будет Array ( [a] => b ) . а нужно чтобы и [c] => d было тоже в массиве (функция вызывается из другого класса).
Если же напрямую вызывать - тогда все будет пучком. Логики не вижу.
-~{}~ 19.10.07 00:45:

PHP Version 5.2.1
Apache 2.0 Handler
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
область видимости.
 

Major

Новичок
KukPHP

ты сам понял что написал? Мистики тут и нет, код рабочий. С какого у тебя вообще $a->log будет содержать то что ты хочешь?
 

Major

Новичок
помоему тут не тока вобласти видимости, а в том, что с какого унего в объекте $a будет то, что он установилв объекте $class???!!!
 

KukPHP

Новичок
если из функции set_log() вызвать print_r($this->log), то все будет показано (т.е. весь массив класса А). Но не сохраняет в него. А как мне осуществить эту задачу? (из функции одного класса изменить(дополнить) переменную другого класса?). Я попробовал через функцию, но так не работает...
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Major
Не как выразился.
Екземпляр класа. :))

public function add_var($name,$value) {
$class = new A;
$class->set_log($name,$value);
print_r($class->log);// тут все ок.
return TRUE;

-~{}~ 19.10.07 00:52:

А как мне осуществить эту задачу?
Синглтон.
в факе все описано.
к сожалению ссылкой подсобить немогу. (фак на профилактике)

раздел паттерны
 

KukPHP

Новичок
то поидее этот код должен работать?
PHP:
<?php
class A {
    public $log = array('a'=>'b');    
    static function set_log($name,$value) {
        $log[$name] = $value;
    return TRUE;
    }
}
class b {
    public function add_var($name,$value) {
        A::set_log($name,$value);
    return TRUE;
    }
}

$b = new b;
$a = new A;
$b->add_var("c","d");
print_r($a->log);
?>
Или мне пора спать?
 

Major

Новичок
Да не спасибо! Ты пытался сделать это, на самом деле:

PHP:
class b { 
	private $class;
	
	public function __construct( &$obj )
	{
		$this->class = $obj;
	}

    public function add_var($name, $value )
    { 
        $this->class->set_log($name,$value); 
    } 
} 


$a = new A; 
$b = new b($a); 

$b->add_var("b","c"); 

print_r($a->log);
Но реально тебе зачем такделать?
 

KukPHP

Новичок
у меня есть скрипт. который использует два класса. клас Make и класс Get. Мейк делает страницу. Гет - получает и обрабатывает данные. И мне нужна статистика. И нужно из класса Get перенести некоторые переменны (притом они в разных методах класса) в клас Мейк, чтобы там их собрать воедино и направить в функцию логгирования. Поэтому я создал в класе Get метод add_var, который будет добавлять переменные в другой клас в массив $log... Надеюсь понятно объяснил...
 
Сверху