Verwenden Sie stdClass in class als Klasse var in PHP 5+

  • Ich scheine das nicht richtig zu machen. Es scheint, dass ich immer wieder ein neues stdClass erstelle, wenn ich zu dem hinzufügen möchte, was für den Geltungsbereich erforderlich ist.

         class d_elem {
            private $el;
            function __constructor($p) {
                $el = new stdClass;
            }
            private static function ele_base($p) {
                print('ele_base<br/>');
                d_elem::ele_base_attr($p);
            }
            private static function ele_base_attr($p) {
                print('ele_base_attr<br/>');
                isset($p['id']) ? $el->id = '' . $p['id'] . '' : '';
                print_r($p);print('<br/>');
                print_r($el);print('<br/>'); //<< 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('<br/>');
                print_r($el);print('<br/>');//<< 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'));
     

    Hat jemand eine Idee?

    Danke-Jeremy

    [BEARBEITEN] ------------------------------------ - gemäß dem obigen Vorschlag

         class d_elem{
            public static $el;
            private static function init(){ 
                self::$el = new stdClass; 
            } 
            private static function ele_base($p) {
                print('ele_base<br/>');
                self::ele_base_attr($p);
            }
            private static function ele_base_attr($p) {
                print('ele_base_attr<br/>');
                isset($p['id']) ? $el->id = '' . $p['id'] . '' : '';
                print_r($el);print('<br/>'); //<< 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('<br/>');
                //skip the retrun
            }
        }
    
        d_elem::ele_a(array('href'=>"#",'TEXT'=>'test','id'=>'test'));
     

    Stellt immer noch die gleiche Ausgabe von

    ele_base

    ele_base_attr

    stdClass-Objekt ([id] = & gt; test)

    stdClass-Objekt ([href] = & gt; # [TEXT] = & gt; test)

    .

    und wollen

    stdClass-Objekt ([id] = & gt; test [href] = & gt; # [TEXT] = & gt; test)

    | >

    tk -J

    [ENDE LÖSUNG SOFORT]

             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
     
    20 October 2012
    hakreuser225626
3 answers
  • Ich kann nicht alles reparieren, aber ein paar Dinge zu beachten:

    __constructor() wird nie aufgerufen, da die Klasse nie instanziiert wird, sondern nur statisch (und sollte __construct() heißen.).

    Es ist nicht erforderlich, echo d_elem::elem_a() zu verwenden, da nichts zurückgegeben wird.

    Wenn Sie Wenn Sie die Funktion als statische Funktionen verwenden möchten, muss die Variable $el auch statisch sein und als self::$el bezeichnet werden. Wenn Sie statische Funktionen innerhalb des Objekts aufrufen, sollten Sie sie auch als self::ele_base_attr() etc.


    BEARBEITEN: Sie könnten die __-Konstruktion in verwandeln eine statische Funktion, dh:

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

    Rufen Sie dann self::init() auf, bevor Sie irgendetwas anderes in d_elem::elem_a().


    BEARBEITEN: Dies bewirkt dasselbe:

     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'));
     
    22 November 2011
    ChrisJim Fiorato
  • Siehe $ this und self , auch späte statische Bindungen

    22 November 2011
    azat
  • Haben Sie dies versucht?:

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

    Und das hier?:

     print_r($this->el);print('<br/>');
     

    Sie können innerhalb einer Klasse auf Variablen zugreifen, die (innerhalb der gesamten Klasse wie $el) deklariert sind. Funktionen innerhalb derselben Klasse müssen Sie die Änderung $el (oder eine beliebige Variable desselben Gültigkeitsbereichs) in $this->el

    ändern
    22 November 2011
    Nonym