PHP CodeIgniter: $this->load->model('Model_name'); Was ist "load"?

KROKvsKROK

Ensign
Registriert
Apr. 2013
Beiträge
149
Hallo,

Ich arbeite mich gerade in das PHP-Framework CodeIgniter ein. In der Doku wird folgendes gemacht (um ein Model zu laden):

http://localhost/citest/user_guide/general/models.html#loading

(Das ganze wird innerhalb einer Controller-Klasse aufgerufen)
PHP:
$this->load->model('Model_name');

"$this" ist eine Referenz auf die derzeitige Controller-Klasse, von der der Aufruf aus erfolgt, ok.

"model('Model_name')" ist ein Funktionsaufruf, ok.

Aber was ist "load"?

Es wird eine Methode model() aufgerufen, mithilfe von load. Aber was ist load?
- Eine Variable ist es nicht, da kein $ davor steht.
- Eine Klasse auch nicht, da model() static sein könnte, aber dann ein :: statt ein -> zwischen load und model() stehen müsste
 
Bei "load" handelt es sich um ein Attribut aus der entsprechenden Controller-Klasse.
Beim Aufruf eines Attributes wird das $-Zeichen weggelassen.

Gruß
Infi
 
@ Infi<3:

Ich habe aber weder in der Klasse Controller noch in der Klasse CI_Controller eine Instanzvariable "load" stehen... Wo kommt diese Variable denn her?

Nehmen wir an ich erstelle mir wie üblich eine eigene Controller-Klasse (Beispiel funktioniert):

PHP:
<?php

class Blog extends CI_Controller {
	
	public function addStuff() {
		$this->load->model('math'); // Model-Klasse math.php existiert
		echo $this->math->add();  // diese Zeile ist eigentlich egal
                // ....
	}
	
}

?>


Die Klasse CI_Controller aus dem Framework sieht wie folgt aus (Kommentare weggelassen), wie man sieht, befindet sich auch hier keine load-Variable:

PHP:
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class CI_Controller {

	private static $instance;

	/**
	 * Constructor
	 */
	public function __construct()
	{
		self::$instance =& $this;

		// Assign all the class objects that were instantiated by the
		// bootstrap file (CodeIgniter.php) to local class variables
		// so that CI can run as one big super object.
		foreach (is_loaded() as $var => $class)
		{
			$this->$var =& load_class($class);
		}

		$this->load =& load_class('Loader', 'core');

		$this->load->initialize();
		
		log_message('debug', "Controller Class Initialized");
	}

	public static function &get_instance()
	{
		return self::$instance;
	}
}

Eigentlich müsste sich die load-Variable ja in einer der beiden Klassen befinden?!
 
Zuletzt bearbeitet:
Das liegt an folgender Stelle im Code:
PHP:
foreach (is_loaded() as $var => $class)
{
    $this->$var =& load_class($class);
}
Hier wird zur Laufzeit für jedes Element von "is_loaded()" ein neues Attribut mit dem Namen des Strings in der Variable $var (key im Array, das von "is_loaded()" als Rückgabewert geliefert wird) erzeugt, in deinem Fall unter anderem "load". Anschließend wird dann die jeweilige Value des Arrays an der Stelle $var (in dem Fall $class) über die "load_class()"-Methode geladen (?) und per Referenz ("=&"-Operator) in das Attribut gespeichert.

Edit: wer lesen kann...
Liegt natürlich an den folgenden Zeilen:
PHP:
$this->load =& load_class('Loader', 'core');
$this->load->initialize();
hier wird zusätzlich das Attribut "load" dynamisch zur Laufzeit erzeugt, Funktionsweise analog zu oben, nur halt ohne Parametrisierung in einer Schleife. Die oben erwähnte Schleife sorgt halt dafür, dass andere Klassen, die vermutlich vom System geladen wurden, eingebunden werden.

Gruß
Infi
 
Zuletzt bearbeitet: (Eklärung erweitert)
@ Infi<3:

Sorry, bin erst jetzt wieder dazu gekommen mir das anzuschauen.

Vielen Dank für deine Erklärung, jetzt habe ich es verstanden, hast mir sehr geholfen ;)
 
Zurück
Oben