kostenloser Webspace werbefrei: lima-city


Innerhalb einer Klasse auf eine andere Klasse zugreifen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    user012

    user012 hat kostenlosen Webspace.

    Hi,
    kennt ihr eine Möglichkeit, wie man in PHP innerhalb einer ganzen Klasse auf eine andere Klasse zugreifen kann?
    Mit dem folgenden Code funktioniert es leider nicht:
    class class1{
    function __construct() {
        require 'class2.php';
        $class2 = new class2();
    }
    function doSth($foo = false){
        if($foo) {
            $class2->abc(); // -> fehler
        }
        }
    }

    Ich kenne bisher nur eine Methode, wie es funktioniert
    require 'class2.php';
    class class1 {
    function doSth($foo=false) {
        class2::abc();
        }
    }

    Bei dieser Methode müssen die Methoden in class2 aber immer statisch sein (sonst gibt's eine Warnung)

    Kennt ihr eine andere Methode? (Außer, dass ich die Klasse ich jeder Methode neu erzeugen müsste oder die Variable superglobal machen müsste)

    Beitrag zuletzt geändert: 12.10.2017 19:17:48 von user012
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Warum erstellst du die Instanz der Klasse nicht im Konstruktor und schreibst sie dann in eine Klassenvariable?
    Also ala:
    require 'class2.php';
    
    class1
    {
     protected $xyz;
     public function __construct()
     {
      $this->xyz = new class2(); 
     }
    
    public foo()
     {
      $this->xyz->bar();
     }
    }
  4. Lass uns erst einmal dem schlimmsten Deiner Fehlern auseinandersetzen. Require/Include sollte niemals in einem Constructor ausgeführt werden, es sei denn es handelt sich dabei um ein Singleton, aber selbst das ist nicht wirklich der richtige weg.

    <?php
    require('Class2.php');
    
    class Class1 {
        public function __construct() {
            //...
        }
    }


    Das ist aber auch unnötig wenn Du einen halbwegs anständigen Autoloader verwenden würdest, der eine Class dann lädt wenn danach gefragt wird, statt pauschal alle Classes zu laden. Siehe PHP Manual spl_autoload_register()


    So, nun mal zu deinem eigentlichen Problem, du hast kein Property/Field was die Instanz speichert, nachdem der Constructor seinen job erledigt hat, wird die Instanz schon wieder entfernt. Also...
    <?php
    require('Class2.php');
    
    class Class1 {
    
        public $instanz;
    
        public function __construct() {
            $this->instanz = new Class2();
        }
    }
    
    $tmp = new Class1();
    $tmp->instanz->method();
  5. Autor dieses Themas

    user012

    user012 hat kostenlosen Webspace.

    muellerlukas schrieb:
    Warum erstellst du die Instanz der Klasse nicht im Konstruktor und schreibst sie dann in eine Klassenvariable?
    Also ala:
    require 'class2.php';
    
    class1
    {
     protected $xyz;
     public function __construct()
     {
      $this->xyz = new class2(); 
     }
    
    public foo()
     {
      $this->xyz->bar();
     }
    }


    Danke:D So funktioniert es



    strange schrieb:
    Lass uns erst einmal dem schlimmsten Deiner Fehlern auseinandersetzen. Require/Include sollte niemals in einem Constructor ausgeführt werden, es sei denn es handelt sich dabei um ein Singleton, aber selbst das ist nicht wirklich der richtige weg.

    <?php
    require('Class2.php');
    
    class Class1 {
        public function __construct() {
            //...
        }
    }


    Das ist aber auch unnötig wenn Du einen halbwegs anständigen Autoloader verwenden würdest, der eine Class dann lädt wenn danach gefragt wird, statt pauschal alle Classes zu laden. Siehe PHP Manual spl_autoload_register()


    So, nun mal zu deinem eigentlichen Problem, du hast kein Property/Field was die Instanz speichert, nachdem der Constructor seinen job erledigt hat, wird die Instanz schon wieder entfernt. Also...
    <?php
    require('Class2.php');
    
    class Class1 {
    
        public $instanz;
    
        public function __construct() {
            $this->instanz = new Class2();
        }
    }
    
    $tmp = new Class1();
    $tmp->instanz->method();

    Habe es jetzt ein wenig ausgebessert:
    spl_autoload_register(function ($class) {
        include 'includes/' . strtolower($class) . '.class.php';
    });
    class class1 {
    private class2;
    
    function __construct() {
    $this->class2 = new class2();
    }
    function foo(){
    $this->class2->abc();
    }
    }


    Wieso meinst du, dass man kein require/include innerhalb des Konstruktors verwenden sollte?
  6. user012 schrieb[...]
    Wieso meinst du, dass man kein require/include innerhalb des Konstruktors verwenden sollte?


    Sobald die Klasse mehrfach verwendet wird, wird auch die Datei mehrfach geladen was Erstens unnötig und Zweitens relativ langsam ist. Dies kann man zwar via include_once/require_once eindämmen, aber warum versuchen operationen mehrfach auszuführen, wenn es eine andere, leichtere, methode gibt?
  7. Autor dieses Themas

    user012

    user012 hat kostenlosen Webspace.

    strange schrieb:
    user012 schrieb[...]
    Wieso meinst du, dass man kein require/include innerhalb des Konstruktors verwenden sollte?


    Sobald die Klasse mehrfach verwendet wird, wird auch die Datei mehrfach geladen was Erstens unnötig und Zweitens relativ langsam ist. Dies kann man zwar via include_once/require_once eindämmen, aber warum versuchen operationen mehrfach auszuführen, wenn es eine andere, leichtere, methode gibt?

    Was wäre denn die andere/leichtere Methode?
  8. user012 schrieb:
    Was wäre denn die andere/leichtere Methode?
    Na genau die, die du auch schon (fast) korrekt umgesetzt hast - mit dem Autoloader.
    Ich muss hier noch anmerken:
    - Den Autoloader packst du am besten in eine eigenständige Datei. Die lässt sich dann einfach von überall her einbinden.
    - Jede Klasse kommt ebenfalls in eine eigene Datei, gemäß dem Namensschema des Autoloaders. Nur dann werden Klassen die man benötigt auch gefunden und es werden keine Klassen unnötig geladen.

    Du musst dann nur noch daran denken, in jeder Datei die als Skripteinstieg dient einmal den Autoloader einzubinden. Anschließend kannst du nach Belieben deine Klassen verwenden und was fehlt wird automatisch geladen.

    So einen Autoloader zu verwenden ist bei großen Projekten wesentlich einfacher als im Blick zu behalten, wer denn jetzt genau wen einbindet.
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!