Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: Cannot declare class

AkeMake [23.04.2019 20:37:30]

#

Tein joskus aikoinaan yhdet nettisivut lähinnä omaan käyttöön ja ne oli tässä jokusen kuukauden käyttämättömänä, jonka aikana domain vanheni. Niinpä latasin sivuston omalle koneelleni MAMP:iin ja avasin sen siinä. Nyt sivu ilmoittaa, että
Fatal error: Cannot declare class Error, because the name is already in use in .../error.php on line 3
Sama ilmoitus tulee, jos lataan sivut takaisin nettiin, mutta uuteen sijaintiin.

Olen siis tällä nettisivulla toteuttanut todella simppelin oman virheen käsittelyn. Koetin tutkia kaikki paikat läpi enkä millään löydä mikä yhtäkkiä heittää tämän Fatal Errorin. (Tiedän, että virheenkäsittelyyn on olemassa PHP:n oma valmis systeemi, joten ei tarvitse siitä huomauttaa...)

Tuolla error.php tiedostossa on äärimmäisen simppeli Error -luokka ja kyseistä tiedostoa/luokkaa kutsutaan ainoastaan handling.php tiedostosta, jonka alussa tuo kutsu on. Handling.php tiedosto on yksinkertaistettuna seuraava:

require_once('error.php');

class Handling {
	private $errors = array();

	public function set_e($error, $seriousness = 3) {
		$this->errors[] = New Error($error, $seriousness);
	}

Mikähän minulla on jäänyt huomaamatta? Mistä tämä Fatal Error yhtäkkiä tulee?

HTML5 [23.04.2019 22:12:22]

#

Näyttää siltä, että PHP:ssä on valmiina Error-niminen luokka. Korjaantuuko ongelma, jos nimeät luokan uudelleen kaikkialle?

AkeMake [23.04.2019 22:44:56]

#

Sehän se oli ratkaisu! Kiitos!!

The Alchemist [27.04.2019 06:05:03]

#

Tuo oli väärä ratkaisu...

Käytä aina namespaceja. Ja jos kirjoitat omia virheluokkiasi, niin silloin sinun tulee luultavasti käyttää sen perusluokkana php:n Exceptionia tai jotain sen alaluokkaa riippuen siitä, millaisesta virheestä haluat luokallasi viestiä.

AkeMake/Error.php:

namespace AkeMake;

use Exception;

class Error extends Exception
{
    public function __construct($message)
    {
        parent::__construct($message);
    }
}

Jossain toisessa tiedostossa, sama namespace:

namespace AkeMake;

throw new Error('apuaaaa');

Jossain toisessa tiedostossa, eri namespace:

namespace AkeMake\Foo;

use AkeMake\Error;

throw new Error('asdsadsa');

Toisessa tiedostossa ilman namespacea, missä php:n natiivi Error-luokka on häiritsemässä:

use AkeMake\Error as CustomError;

throw new CustomError('asd');

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta