Используйте stdClass в классе как класс var в php 5+

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

class d_elem {
 private $el;
 function __constructor($p) {
 $el = new stdClass;
 }
 private static function ele_base($p) {
 print('ele_base');
 d_elem::ele_base_attr($p);
 }
 private static function ele_base_attr($p) {
 print('ele_base_attr');
 isset($p['id']) ? $el->id = '' . $p['id'] . '' : '';
 print_r($p);print('');
 print_r($el);print(''); //<< should have added the id but created a new one????
 }
 public static function ele_a($p) {
 d_elem::ele_base($p);
 isset($p['href']) ? $el->href = '' . $p['href'] . '' : '';
 isset($p['TEXT']) ? $el->TEXT = '' . $p['TEXT'] . '' : '';
 print_r($p);print('');
 print_r($el);print('');//<< should have added the id but only has the href and TEXT when all 3 should be there
 //skip the retrun
 }
 }

 echo d_elem::ele_a(array('href'=>"#",'TEXT'=>'test','id'=>'test'));

У кого-нибудь есть идея?

спасибо -Jeremy

[EDIT] -------------------------------------- за предложение выше

class d_elem{
 public static $el;
 private static function init(){ 
 self::$el = new stdClass; 
 } 
 private static function ele_base($p) {
 print('ele_base');
 self::ele_base_attr($p);
 }
 private static function ele_base_attr($p) {
 print('ele_base_attr');
 isset($p['id']) ? $el->id = '' . $p['id'] . '' : '';
 print_r($el);print(''); //<< should have added the id but created a new one????
 }
 public static function ele_a($p) {
 self::init();
 self::ele_base($p);
 isset($p['href']) ? $el->href = '' . $p['href'] . '' : '';
 isset($p['TEXT']) ? $el->TEXT = '' . $p['TEXT'] . '' : '';
 print_r($el);print('');
 //skip the retrun
 }
 }

 d_elem::ele_a(array('href'=>"#",'TEXT'=>'test','id'=>'test'));

Все еще производит тот же вывод

ele_base

ele_base_attr

stdClass Object ([id] => test)

stdClass Object ([href] => # [TEXT] => test)

,

и хотите

stdClass Object ([id] => test [href] => # [TEXT] => test)

tk -J

[КОНЕЦ РЕШЕНИЯ КАК ЕЩЕ]

class d_elem {
 private static $el; /// fill this as we run from function to function
 private static function init(){ // start off but creating the object
 self::$el = new stdClass; 
 } 
 private static function ele_base($p) {
 self::ele_base_attr($p);// here we fill base on some condition.. simple test first
 }
 private static function ele_base_attr($p) {
 isset($p['id']) ? self::$el->id = ' id="' . $p['id'] . '" ' : ''; // this should be pushed to the class level object
 }
 public static function ele_a($p) {
 $p=!is_array($p)?get_object_vars ($p):$p; // make sure that if p is an object we trun it to an array
 self::init();// set the class object
 self::ele_base($p);// make first add to class object
 isset($p['href']) ? self::$el->href = ' href="' . $p['href'] . '" ' : ''; make second add to the class object
 foreach (self::$el as $key => $value) {
 $ele .= $value; // spit the values back out to return from the class object
 }
 $ele .= $p['TEXT'] ; // test something to return at this level 
 return $ele // return all the properties in this case a string of them
 }
 }

 echo d_elem::ele_a(array('href'=>"#",'TEXT'=>'test','id'=>'test')); // call for the output
3 ответа

Я не могу все исправить, но кое-что нужно отметить:

__constructor() никогда не вызывается, потому что класс никогда не получает экземпляр, но называется статически (и его следует называть __construct()).

Нет необходимости echo d_elem::elem_a() потому что ничего не возвращается.

Если вы хотите использовать функцию как статические функции, переменная $el также должна быть статической и называется self::$el. Аналогично, при вызове статических функций внутри объекта вы должны называть их self::ele_base_attr() и т.д.

EDIT: вы можете превратить __construct в статическую функцию, то есть:

private static function init()
{
 self::$el = new stdClass;
}

Затем вызовите self::init() прежде чем делать что-либо еще в d_elem::elem_a().

EDIT: Это достигается тем же:

class d_elem {
 public static $el;

 public static function ele_a($p) {
 self::$e = new stdClass;

 if(isset($p['href'])) $el->href = $p['href'];
 if(isset($p['TEXT'])) $el->TEXT = $p['TEXT'];
 if(isset($p['id'])) $el->id = $p['id'];

 print_r(self::$el);
 }
}

d_elem::ele_a(array('href'=>"#",'TEXT'=>'test','id'=>'test'));


Вы пробовали это?:

isset($p['id']) ? $this->el->id = '' . $p['id'] . '' : '';

И это?:

print_r($this->el);print('');

Внутри класса для доступа к объявленным переменным (для всего класса, используемого как $el) из методов/функций внутри этого же класса вам понадобится изменение $el (или любая переменная той же области) в $this->el

licensed under cc by-sa 3.0 with attribution.