Bonjour à tous,

je suis au 18éme partie de la formation sur la poo et je recontre un probleme avec mon code.
quand je fait ça sur la class table:

public function query($statement, $attributes=null, $one=false{

            if($attributes){

                    $this->db->prepare($statement, $attributes, str_replace("Table","Entity", get_class($this)), $one);

            }else{

                    $this->db->prepare($statement,  str_replace("Table","Entity", get_class($this)), $one);

            }
}

et sur ma page home j'ai une erreur qui s'affiche en disant qu'il ne trouve pas la classe ArticleEntity sur App\Table\ArticleEntity parce que la classe PostEntity moi je le nommé ArticleEntity et je suis bloqué je ne sait pas comment evolué.

Merci d'avance sur vos reponses!

11 réponses


Salut,

Peut-être un problème de namespace.

Montre nous la fonction prepare pour voir ?

Avec aussi les 1ères lignes du fichier "MysqlDatabase.php"
(au moins tout ce qu'il y a avant le mot-clé "class", et cette même ligne aussi)

Et de la même façon :
les 1ères lignes du fichier "Table.php",
les 1ères lignes du fichier "PostTable.php",
les 1ères lignes du fichier "Entity.php",
les 1ères lignes du fichier "PostEntity.php".

Table.php

namespace core\table;

class Tables{

    protected $table;
    protected $db;

    public function __construct(\core\database\MysqlDatabase $db){

            $this->db=$db;

        if (is_null($this->table)) {

            $part=explode('\\', get_class($this));
            $class_name=end($part);
            $this->table=strtolower(str_replace("Table", "", $class_name));

        }
    }

    public static function getInstance(){

        return new Tables();
    }

le fichier PostTable moi je le nommé ArticleTable voici aussi son code

<?php
namespace app\table;
use core\table\Tables;

class ArticleTable extends Tables{

public function last(){

    return $this->query("
        SELECT articles.id, articles.titre, articles.contenu, articles.date, categories.titres as categorie FROM articles 
        LEFT JOIN categories ON categorie_id= categories.id 
        ORDER BY articles.date DESC ");
}

}

le fichier Entity je l'ai pas créer je pas trouver bon de le faire et le fichier PostEntity je le nommé aussi ArticleEntity voici aussi son code

<?php 

namespace app\Entity;

class ArticleEntity{

    public function getUrl(){

        return "index.php?p=single&id=".$this->id;
    }

    public function extrait(){

        $html="<p>".substr($this->contenu, 0, 450)."</p>";
        $html.='<p><a href="' . $this->getURL() . '">voir la suite</a></p>';

        return $html;
    }

}

et je pas aussi voulu de faire la methode magic dans le fichier ArticleEntity j'appel directement la fonction dans la page home

Salut,

Ta classe s'appelle ArticleEntity et non PostEntity ça vient sûrement de là ;)
Renomme ta classe et ton fichier correctement, et accorde toi sur les noms.

bon c moi qui est commis une erreur quand je essayer d'ecrire mais voici l'erreur que je reconte :

Warning: require(C:\xampp\htdocs\Refactoring\app/table/ArticleEntity.php): failed to open stream: No such file or directory in C:\xampp\htdocs\Refactoring\app\autoloader.php on line 17

Fatal error: require(): Failed opening required 'C:\xampp\htdocs\Refactoring\app/table/ArticleEntity.php' (include_path='C:\xampp\php\PEAR') in C:\xampp\htdocs\Refactoring\app\autoloader.php on line 17

Il me semble à moins que je me trompe, que la ArticleEntity extends de Entity ?
Et la il cherche ArticleEntity dans le dossier table, ne devrait-il pas se trouver dans le dossier Entity ?

Carouge10 je pas vraiment compris votre reponse

Ton appli cherche le ArticleEntity dans le namespace App/Table au lieu de App/Entity.

oui et je ne comprend pas ça

Peux-tu nous montrer ton fichier autoloader.php?

pour app

<?php
namespace app;

class autoloader{

    static function register(){

        spl_autoload_register(array(__CLASS__, 'mon_autoload'));
    }

        static function mon_autoload($class_name){
            if(strpos($class_name, __NAMESPACE__.'\\')===0){

                $class_name= str_replace(__NAMESPACE__.'\\', '', $class_name);
                $class_name= str_replace('\\', '/', $class_name);
                require __DIR__."/".$class_name.'.php';

            }

            }

}

?>

pour core

<?php
namespace core;

class autoloader{

    static function register(){

        spl_autoload_register(array(__CLASS__, 'mon_autoload'));
    }

        static function mon_autoload($class_name){
            if(strpos($class_name, __NAMESPACE__.'\\')===0){

                $class_name= str_replace(__NAMESPACE__.'\\', '', $class_name);
                $class_name= str_replace('\\', '/', $class_name);

                require __DIR__."/".$class_name.'.php';
            }

            }

}

?>

hello,
2 class autoloader ? possible mais.......
tu pourrais envoyer la hierarchie de ton app ? genre :

/app
    |- core
    |   |-autoloader.php
    |-app
    |   |-autoloader.php
    ...