Bonjour,

Je suis le tuto POO de @grafikart et j'ai un probleme :
Voici ce que je fais dans l'un de mes controleurs :

        $product = new ProductTable();
        $cat = new CategoryTable();
        var_dump($product::getTable()); //ligne19
        var_dump($cat::getTable()); //ligne 20

et j'obtient :
<pre style="background : #ccc;color : #521"> D:\wamp64\www\slim\app\Controllers\ProductsController.php:19:string 'ProductTable' (length=12)
D:\wamp64\www\slim\app\Controllers\ProductsController.php:20:string 'ProductTable' (length=12)</pre>

Table.php

class Table
{
    protected $database;
    protected static $table;

    public function __constuct()
    {
        $this->database = InitApp::getInstance()->getDatabase();
    }

    public static function getTable()
    {
        if( null === static::$table) {
            $class_name = explode('\\',get_called_class());
            var_dump($class_name);
            static::$table = end($class_name);
        }
        return static::$table;
    }

    public function __get($key)
    {
        $method = 'get'.ucfirst($key);
        return $this->$method();
    }
}

productTable et CategoryTable

class ProductTable extends Table
{

}

class CategoryTable extends Table
{

}

je ne comprend pas pourquoi ça affiche encore ProductTable alors qu'il s'agit de l'objet CategoryTable ??
si j'inverse les ligne 19 et 20 alors le resultat sera deux fois CategoryTable.

edit : en fait je vois bien que ça réagit comme un seul objet instancié mais c'est étrange non ?

5 réponses


Huggy
Réponse acceptée

La variable $table étant statique, elle n'existe qu'en un seul exemplaire
le fait que tu l'affectes uniquement si elle est nulle, elle s'affecte uniquement la première fois

pourquoi est-elle statique ?

Huggy
Réponse acceptée

Dans la vidéo, il a mis aussi des $table dans les classes filles
et c'est celles la qui sont appelées par static::$table

mrdus
Auteur

merci de ta réponse,
pourquoi est-elle statique ? parce que j'ai simplement fait comme dans le tuto mais je me pose la question pareil.
y'a tout plein de methode statique dans le code du tuto, et on s'y perd un peu.

C'est sur sans tous ces statics ça fonctionne.
mais alors pourquoi @Grafikart fait il cet exemple comme ça ? :
https://youtu.be/3pACUHqop9U?t=1181

edit ça ressemble fortement à une erreur, je viens de trouver ce comportement décrit dans la doc sur la portée des variables.

Bonjour

La syntaxe " if( null === static::$table) { " , ne devrait-elle pas plutôt ressembler à ceci :

if( static::$table === null ){

cdt

Alain

mrdus
Auteur

merci ça fonctionne en mettant les variables egalement das les classes filles.
@ alain9034, je ne pense pas que cela fasse de difference, mais j'avais essayé aussi, a tout hasard :)