Доступ к статичным переменным.

Solid

Drosera anglica
Доступ к статичным переменным.

Не могу разобраться, помогите хотя бы ссылками... По-идее рыть надо в сторону singleton'ов, но... В общем есть класс:
PHP:
class A {
 var $id = 'default';

 function A() {
  $this->id = 'constructor';
 }

 function ech() {
  echo $this->id;
 }
}

class B {
 function B() {
  A::$id = 'new';
 }
}
$a = new A();
new B();
$a->ech(); // должно выводить new

Заранее благодарен,
Дмитрий.
 

Sam

Новичок
PHP:
class A {
 var $id = 'default';

 function A() {
  $this->id = 'constructor';
 }

 function echo() {
  echo $this->id;
 }
}

class B() {
 function B(&$a) {
  $a->id = 'new';
 }
}
 

Solid

Drosera anglica
Автор оригинала: Sam
PHP:
class A {
 var $id = 'default';

 function A() {
  $this->id = 'constructor';
 }

 function echo() {
  echo $this->id;
 }
}

class B() {
 function B(&$a) {
  $a->id = 'new';
 }
}
Хотелось бы без передачи ссылки на объект в конструктор.

-~{}~ 15.03.06 03:10:

Всё дело в том, что пример я подобрал не совсем подходящий. То, что мне надо:
PHP:
class A {
	var $id = 'default';

	function A() {
		$this->id = 'constructor';
	}

	function ech() {
		echo $this->id;
	}

	function runB() {
		B::B();
	}
}

class B {
	function B() {
		A::$id = 'new';
	}
}

$a = new A();
$a->runB();
$a->ech();
-~{}~ 15.03.06 03:11:

Опять же таки, не очень хочеться передавать из A ссылку на $this в конструктор B. Хотелось бы несколько другого решения.
 

Sam

Новичок
попробуй добираться до свойства через метод. или тебе именно сразу к свойству хочется?

Опять же таки, не очень хочеться передавать из A ссылку на $this в конструктор B
почему?
 

Sam

Новичок
PHP:
class A {
    var $id = 'default';

    function A() {
        $this->id = 'constructor';
    }

    function ech() {
        echo $this->id;
    }

    function setId($val) {
        $this->id = $val;
    }

    function runB() {
        $b = new B();
    }
}

class B {
    function B() {
        A::setId ( 'new');
    }
}

$a = new A();
$a->runB();
$a->ech();
 

Solid

Drosera anglica
Автор оригинала: Sam
попробуй добираться до свойства через метод. или тебе именно сразу к свойству хочется?
Очень странно. Раньше писал так, не работало... Думал ещё, в чём дело?

В общем разрешилось, спасибо за подсказку.

PHP:
class A {
	var $id = 'default';

	function A() {
		$this->id = 'constructor';
	}

	function ech() {
		echo $this->id;
	}

	function runB() {
		B::B();
	}
	
	function set_id($value) {
		$this->id = $value;
	}
}

class B {
	function B() {
		A::set_id('new');
	}
}

$a = new A();
$a->runB();
$a->ech();
Хотя, узнать как записать в propery тоже бы не помешало.

-~{}~ 15.03.06 03:22:

Автор оригинала: Sam
почему?
Из А в методы В и так уже слишком много аргументов поступает. Хочеться сократить всё к минимуму, что бы использовать класс было удобно, и случайно не забывать передать ссылку на A.

-~{}~ 15.03.06 03:24:

Автор оригинала: vittorio
class A {
static $id = 'default';
etc...
Сам об этом думал... выводит constructor.

-~{}~ 15.03.06 03:25:

Да и не хотелось бы использовать возможности PHP5.
 

vittorio

Новичок
Тот же результат, только код покороче:
class A {
static $id = 'default';

function A() {
A::$id = 'constructor';
}

function ech() {
echo A::$id;
}

function runB() {
B::B();
}
}

class B {
function B() {
A::$id = 'new';
}
}

$a = new A();
$a->runB();
$a->ech();
 

Solid

Drosera anglica
Ещё вопрос по той же схеме. Возможно ли сделать в PHP4 нечто вроде:
PHP:
	function set($name, $value) {
		$this->$name = $value;
	}
 

Sam

Новичок
почитай про инкапсуляцию

-~{}~ 15.03.06 03:31:

Автор оригинала: Solid
Ещё вопрос по той же схеме. Возможно ли сделать в PHP4 нечто вроде:
PHP:
	function set($name, $value) {
		$this->$name = $value;
	}
можно. вообще-то обращение к неименованым свойствам происходиит дольше, так что не стоит этим делом злоупотреблять. да и вообще этим не стот злоупотреблять )
 

Solid

Drosera anglica
Автор оригинала: Sam
почитай про инкапсуляцию
Читал... но видимо не всё. Может быть, ссылочку подкинете? Хотелось бы в это дело вникнуть настолько серьёзно, насколько это вообще возможно.

Автор оригинала: Sam
можно. вообще-то обращение к неименованым свойствам происходиит дольше, так что не стоит этим делом злоупотреблять
А пример можете дать? Или ту же ссылку?

-~{}~ 15.03.06 03:36:

Автор оригинала: vittorio
Тот же результат, только код покороче:
class A {
static $id = 'default';

function A() {
A::$id = 'constructor';
}

function ech() {
echo A::$id;
}

function runB() {
B::B();
}
}

class B {
function B() {
A::$id = 'new';
}
}

$a = new A();
$a->runB();
$a->ech();
Вот про доступ к static просмотрел. Спасибо.
 

Sam

Новичок
так ты её решил )

PHP:
class A {
  var $id = 'default';

  function set($name, $value) {
     $this->$name = $value;
  }
}

$a=  new A();
$a->set('key','val');

var_dump($a);
работающий код
 

Solid

Drosera anglica
Автор оригинала: Sam
так ты её решил )

PHP:
class A {
  var $id = 'default';

  function set($name, $value) {
     $this->$name = $value;
  }
}

$a=  new A();
$a->set('key','val');

var_dump($a);
работающий код
К сожалению только в PHP5. :(

-~{}~ 15.03.06 03:47:

Ах да, в самом деле... совсем запутался.. :)) Спасибо.

-~{}~ 15.03.06 03:56:

Насчёт скорости выполнения:
1)
PHP:
$this->$name = $value;
2)
PHP:
$this->id = $value;
1) 8.25666379929
2) 6.26926898956

Как видно, второй метод лишь в 1.3 раза выигрывает у первого метода. Так что если подобный вызов используется раз 5 в скрипте, то можно и пренебречь.
 

Sam

Новичок
это плохая практика - так делать без крайней надобности. дело не столько в быстродействии
то что пхп - демократичен не даёт тебе права писать плохой код )
 

Solid

Drosera anglica
Появилась проблемма несколько иного характера, видимо теперь без ссылки или singleton'a не обойтись. Идея проста...
PHP:
class A {
    var $id = 'default';

    function A() {
        $this->id = 'constructor';
    }

    function cout() {
        echo $this->id;
    }

    function run_B() {
        new B(); // ЭТО ТО, ЧТО ИЗМЕНИЛОСЬ
    }
    
    function set($name, $value) {
        $this->$name = $value;
    }
}

class B {
    function B() {
        A::set('id', 'new');
    }
}

$a = new A();
$a->run_B();
$a->cout();
 

Andreika

"PHP for nubies" reader
Solid
объясни всю начальную идею... а не эти куски кода.. а то чета фикня какая получается
 

Solid

Drosera anglica
Начальная идея в самом начале. :)

Насамом деле я делаю что-то вроде:
PHP:
$array = call_user_func(array(new CoreGet(), 'get_'.$args[0]), $args2func);
Где CoreGet - класс, отличный от того, где данная функция исполняется, 'get_'.$args[0] - функция в классе CoreGet, $aegs2func - аргументы, которые передаються в функцию 'get_'.$args[0].
Требуеться из функции get_'.$args[0] в классе CoreGet(), который создан через new, изменить содержимое данного класса, где вызывается функция call_user_func.

-~{}~ 15.03.06 04:32:

Даже если вызываем:
PHP:
$array = call_user_func(array('CoreGet', 'get_'.$args[0]), $args2func);
а затем в CoreGet в функции get_.... исполняем
PHP:
Core::set('member_id', '20');
Пишет что: Using $this when not in object context
 

Andreika

"PHP for nubies" reader
угу.. тока тема статических переменных не раскрыта
и вообще зачем так хитро все было придумано?
 
Сверху