2010-08-06 4 views
0

Je ne sais pas comment formuler cette question dans un moteur de recherche.Méthode de classe appelant une autre méthode de classe sans include/require?

Je suis un peu confus comment les classes utilisent les méthodes d'autres classes sans include/require. J'ai vu cela en PHP quelques temps maintenant. Venant de l'arrière-plan C++, j'ai dû tout inclure pour l'utiliser, donc c'est un peu déroutant.

Mais ok on y va:

Dire que j'ai improve_db_connection.php:

class improve_db_connection 
{ 

    protected $_connection; 

    public function __construct($host, $user, $pwd, $db) 
    { 
     $this->_connection = @new mysqli($host, $user, $pwd, $db); 
     if (mysqli_connect_error()) { 
      throw new RuntimeException('Cannot access database: ' . 
       mysqli_connect_error()); 
     } 
    } 

    public function getResultSet($sql) 
    { 
     $results = new Pos_MysqlImprovedResult($sql, $this->_connection); 
     return $results; 
    } 
} 

Le new Pos_MysqlImprovedResult est une instance de Pos_MysqlImprovedResult classe, non improve_db_connection. Sans déclarer la fonction include pour inclure la classe Pos_MysqlImproveResult, le fichier improve_db_connection.php sait simplement où se trouve la classe.

Est-ce parce que le Pos_MysqlImproveResult.php se trouve dans le même répertoire que improve_db_connection.php?

C'est la même chose avec Zend Framework. Mais les fichiers sont dans des sous-répertoires et autres. J'ai une classe dans application/modules/SF/models qui utilise une autre fonction de classe qui est dans application/modules/SF/models/resources. Est-ce parce que la convention de nommage Zend de ces classes que Zend analyse juste à travers ces fichiers et l'ajoute dans le __autoload du php?

Répondre

1

Zend Framework utilise Zend_Loader pour charger automatiquement les classes lorsque vous les référencez, tant qu'elles peuvent les trouver dans un emplacement logique. Je suppose que vous exécutez un script basé sur Zend Application, qui configure automatiquement l'autochargeur pour vous et fait tout le travail. Comme vos fichiers se trouvent dans leurs dossiers logiques et que les classes ont les noms de conventions ZF, ZF les trouvera et les chargera lorsque vous les référencerez.

Plus d'informations sont au manuel ZF:
http://framework.zend.com/manual/en/zend.loader.html
http://framework.zend.com/manual/en/zend.application.html

+0

Et si ce n'est pas une application Zend, il peut toujours utiliser un chargeur automatique qui sera défini quelque part dans l'un des fichiers de script, et peut être lu pour déterminer quels chemins il vérifie avant d'inclure tous les fichiers nécessaires. –

2

Pour ajouter à l'explication de Valorin, il y a une méthode magique en PHP qui tente de rechercher des définitions de classe quand il ne peut pas trouver la définition de classe. Pour une explication détaillée, allez ici: http://php.net/manual/en/language.oop5.autoload.php

L'essentiel de c'est:

function __autoload ($class_name) { 
    // write your logic to find the class name 

    // iterate over the available paths 
    foreach(explode(PATH_SEPARATOR, get_include_path()) as $path) { 
     // create a local variable representing the file path to the would be include file 
     $file = implode(DIRECTORY_SEPARATOR, array(
      $path, "{$class_name}.class.inc", 
     )); 

     // If the file doesn't exist, continue, avoiding further processing 
     if (!file_exists($file)) { continue; } 

     // require the file, and return to avoid further processing 
     require_once $file; 
     return; 
    } 
} 

// provided there's a foo.class.inc file in one of your paths ... 
$Foo = new Foo; 
Questions connexes