PHP Klassenvererbung: because the name is already in use

w0nd4bra

Commander
Registriert
März 2008
Beiträge
2.512
Hallo,

Php macht laune, schon stolpert man über erste Probleme, die man aus anderen Sprachen nicht kennt und keine Ahnung hat, wie man das Problem angehen soll bzw. wonach man suchen muss.

Habe 3 Klassen A, B und eine Helper.

Helper soll A und B nur um Funktionen erweitern, die eh in beiden vorkommen, wollte nur Schreibarbeit sparen.

PHP:
class Helper
class A extends Helper
class B extends Helper

Cannot declare Helper, because the name is already in use

alle 3 Klassen liegen in 3 seperaten Dateien.

​Any ideas?
 
Eine Klasse kann mMn nur 1x erweitert werden.


Also:
class Helper
class A extends Helper
class B extends A

Evtl hilft dir das Stichwort "Traits" weiter.
 
Zeig mal etwas mehr von deinem Code.

Bei mir geht das ohne Fehler.

PHP:
<?php

class Helper {
        public function help(){
                echo "HELP!";
        }
}

class A extends Helper {
        public function help(){
                echo "a";
        }
}

class B extends A {
        public function help(){
                echo "b";
        }
}

$helper = new Helper();
$a = new A();
$b = new B();
$helper->help();
$a->help();
$b->help();

Ausgabe:
Code:
HELP!ab

Ich vermute, dass du die PHP Datei mit "Helper" zweimal includest. -> include_once und require_once können helfen.
 
Zuletzt bearbeitet:
Helper.php
PHP:
trait Helper {        
    public function multi_request($list_of_urls, $connections) { ... }
    public function single_request($url) {...}
​}

A.php
PHP:
require 'Helper.php';
class A {
       use Helper;
}

B.php
PHP:
require 'Helper.php';
class B {
       use Helper;
}
 
Sephe schrieb:
Eine Klasse kann mMn nur 1x erweitert werden.
Du meinst Mehrfachvererbung - das geht nicht. Dafür wurden Interfaces und Traits geschaffen.
Code:
class A {}
class B {}
class R extends A, B {}
Sturm91 schrieb:
Php macht laune, schon stolpert man über erste Probleme, die man aus anderen Sprachen nicht kennt und keine Ahnung hat, wie man das Problem angehen soll bzw. wonach man suchen muss.
Genau das Problem hast du in anderen Sprachen exakt genauso. In C(++) kommst du ohne #pragma once oder #ifndef Deklarationen genauso wenig weiter.

Dein Problem ist, dass du die Fehlermeldung nicht verstehst, obwohl diese doch eindeutig ist.
Code:
Cannot declare Helper, because the name is already in use
Es kann Helper nicht deklariert werden, weil Helper bereits deklariert wurde. Und wie kann sowas auftreten, na? ;)

a.php:
Code:
<?php

include "Helper.php";

class A {}

b.php:
Code:
<?php

include "Helper.php";

class B {}

r.php:
Code:
<?php

include "a.php";
include "b.php"; // <-- hier knallts, denn Helper.php wurde bereits durch a.php eingebunden und deklariert

...
Wechsel also auf die *_once Konstrukte zur Einbindung von Klassen oder noch besser - benutz einen ordentlichen Autoloader (PSR-4).

Mal ein ganz banaler Autoloader:
Code:
<?php

spl_autoload_register( function ( $Classname )
{
	$Split          = explode( "\\", $Classname );

	$Files = [
		__DIR__."/src/".str_replace( "\\", "/", $Classname ).".php"
	];

	foreach( $Files as $Filename )
	{
		if( file_exists( $Filename ) )
		{
			require_once $Filename;
			break;
		}
	}
} );
Der lädt automatisch die Klassen im Verzeichnis /src/ je nach geforderter Klasse inkl. Namespace.

In deinem Fall also:
  • /src/Helper.php
  • /src/A.php
  • /src/B.php

Läge Helper im Namespace Utils
Code:
<?php

namespace Utils;

class Helper {}
käme die Datei ergo in /src/Utils/Helper.php.

Dann brauchst du keine include- oder require-Orgien mehr veranstalten, sondern kannst einfach normal programmieren:

r.php:
Code:
<?php

$a = new A();
$b = new B();
$h = new Utils\Helper();
// und hier knallts nirgendwo
 
Zurück
Oben