web-dev-qa-db-fra.com

Puis-je instancier un PHP classe dans une autre classe?

Je me demandais s'il était permis de créer une instance d'une classe dans une autre classe.

Ou dois-je le créer à l'extérieur, puis le transmettre par le constructeur? Mais alors je l'aurais créé sans savoir si j'en aurais besoin.

Exemple (une classe de base de données):

class some{

if(.....){
include SITE_ROOT . 'applicatie/' . 'db.class.php';
$db=new db
41
Richard

Vous ne pouvez pas définir une classe dans une autre classe. Vous devez inclure des fichiers avec d'autres classes en dehors de la classe. Dans votre cas, cela vous donnera deux classes de niveau supérieur db et some. Dans le constructeur de some, vous pouvez décider de créer une instance de db. Par exemple:

include SITE_ROOT . 'applicatie/' . 'db.class.php';

class some {

    public function __construct() {
        if (...) {
            $this->db = new db;
        }
    }

}
33
Lukáš Lalinský

Les gens qui disent qu'il est possible de "créer une classe dans une classe" semblent vouloir dire qu'il est possible de créer un objet/une instance dans une classe. Je n'ai pas vu d'exemple d'une définition de classe réelle dans une autre définition de classe, qui ressemblerait à ceci:

class myClass{

    class myNestedClass{

    }

}

/* THIS IS NOT ALLOWED AND SO IT WON'T WORK */

Puisque la question était "est-il possible de créer une classe dans une autre classe", je ne peux que supposer que ce n'est PAS possible.

16
vincentDV

Je voulais juste souligner qu'il est possible de charger une définition de classe de manière dynamique dans une autre définition de classe.

Lukas a raison de dire que nous ne pouvons pas définir une classe dans une autre classe, mais nous pouvons les inclure () ou les requérir () de manière dynamique, car toutes les fonctions et classes définies dans le fichier inclus auront une portée globale. Si vous avez besoin de charger une classe ou une fonction de manière dynamique, incluez simplement les fichiers dans l'une des fonctions de la classe. Tu peux le faire:

function some()
{
    require('db.php');
    $db = new Db();
    ...
}

http://php.net/manual/en/function.include.php

14
rickchristie

Il est impossible de créer une classe dans une autre classe en PHP . Créer un objet (une instance d'une classe) dans un autre objet est une chose différente.

3
Marius Burz

Non ce n'est pas possible. Les classes imbriquées et les objets d'agrégation sont des mécanismes différents. Classes imbriquées signifie noms de classes imbriquées , en fait. La classe A imbriquée dans la classe B serait nommée "B\A" (?). À partir de la version 5.3, vous pouvez imbriquer les noms de classe (et quelques autres noms) dans des espaces de noms.

2
Radek M

Ceci est possible dans PHP 7 avec Classes anonymes .

Voir l'exemple de the docs :

class Outer
{
    private $prop = 1;
    protected $prop2 = 2;

    protected function func1()
    {
        return 3;
    }

    public function func2()
    {
        return new class($this->prop) extends Outer {
            private $prop3;

            public function __construct($prop)
            {
                $this->prop3 = $prop;
            }

            public function func3()
            {
                return $this->prop2 + $this->prop3 + $this->func1();
            }
        };
    }
}

echo (new Outer)->func2()->func3();
// Output: 6

Voici un exemple simple montrant l'utilisation de classes anonymes, mais pas à l'intérieur d'une classe:

// Pre PHP 7 code
class Logger
{
    public function log($msg)
    {
        echo $msg;
    }
}

$util->setLogger(new Logger());

// PHP 7+ code
$util->setLogger(new class {
    public function log($msg)
    {
        echo $msg;
    }
});
1
Jon Surrell

(Éditer) Ok la question et l'exemple de ce que vous essayez d'accomplir sont déroutants. Il semble, d'après votre exemple, que vous essayez de définir une classe dans une autre classe.

Le nom correct pour cela est NESTED CLASS et ce n’est pas possible en PHP ..__ Donc, pour votre exemple, la réponse est "NON". Pas dans PHP de toute façon. D'autres langues autoriseront les "classes imbriquées". Java est un exemple. 

Par exemple cela ne fonctionnera pas en PHP

class outer_class{
    class inner_class{
        ...
    }
    ...
}

Maintenant, la question posée est de créer UNE INSTANCE d'une classe dans une autre classe.

Pour cela, la réponse est "OUI", vous pouvez INSTANTIR un "objet" dans une "classe". Nous le faisons tout le temps. 

class simple_class{

    protected $instanceOfOtherClass;

    public function instanciateObject_KeepingAReferenceToIt(){
        // create an instance of OtherClass and associate it to $this->instanceOfOtherClass
        $this->instanceOfOtherClass = new OtherClass();
    }

    public function instanciateObject_Without_KeepingAReferenceToIt(){
        // create an instance of OtherClass and return it
        return new OtherClass();
    }
}

Une classe peut même s'instancier elle-même. C’est ce que fait le célèbre singleton et de nombreux autres modèles Creational . Malheureusement, certaines personnes croient que connaître la dépendance par injection signifie qu’elles n’appelleront plus jamais NEW dans une méthode. FAUX.

Il est utile de comprendre la différence entre une classe et un objet . Un class est un modèle de code de programme extensible permettant de créer des objets . Un objet fait référence à une instance particulière d'un classe.

0
Siegfried DuDragon