Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
310 changes: 310 additions & 0 deletions reference/yaf/yaf-loader.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,310 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 330a38c4d45556b49e06ebe6d39e0e311534cd8c Maintainer: lacatoire Status: ready -->
<!-- Reviewed: no -->

<reference xml:id="class.yaf-loader" role="class" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">

<title>Die Klasse Yaf_Loader</title>
<titleabbrev>Yaf_Loader</titleabbrev>

<partintro>

<!-- {{{ Yaf_Loader intro -->
<section xml:id="yaf-loader.intro">
&reftitle.intro;
<para>
<classname>Yaf_Loader</classname> stellt eine umfassende Autoloading-Lösung
für Yaf bereit.
</para>
<para>
Beim ersten Abruf einer Instanz von <classname>Yaf_Application</classname>
erzeugt <classname>Yaf_Loader</classname> ein Singleton und registriert sich
selbst bei spl_autoload. Eine Instanz wird mittels
<methodname>Yaf_Loader::getInstance</methodname> abgerufen.
</para>
<para>
<classname>Yaf_Loader</classname> versucht, eine Klasse nur einmal zu laden;
schlägt dies fehl, hängt das Verhalten von <link
linkend="ini.yaf.use-spl-autoload">yaf.use_spl_autoload</link> ab: Ist diese
Konfiguration On, gibt <methodname>Yaf_Loader::autoload</methodname>
&false; zurück und gibt damit anderen Autoload-Funktionen eine Chance. Ist sie
Off (Standard), gibt <methodname>Yaf_Loader::autoload</methodname>
&true; zurück, und, was wichtiger ist, es wird eine sehr nützliche Warnung
ausgelöst (sehr nützlich, um herauszufinden, warum eine Klasse nicht geladen
werden konnte).
<note>
<para>
yaf.use_spl_autoload sollte Off bleiben, es sei denn, eine Bibliothek
verfügt über einen eigenen Autoload-Mechanismus, der nicht umgeschrieben
werden kann.
</para>
</note>
</para>
<para>
Standardmäßig nimmt <classname>Yaf_Loader</classname> an, dass alle
Bibliotheken (Skripte mit Klassendefinitionen) im <link linkend="ini.yaf.library">globalen
Bibliotheksverzeichnis</link> liegen, das in der php.ini (yaf.library)
definiert ist.
</para>

<para>
Soll <classname>Yaf_Loader</classname> bestimmte Klassen (Bibliotheken) im
<link linkend="yaf-loader.props.library">lokalen Klassenverzeichnis</link>
suchen (das in der application.ini definiert ist und standardmäßig
<link
linkend="configuration.yaf.directory">application.directory</link> . "/library" lautet),
so muss das Klassenpräfix mittels
<methodname>Yaf_Loader::registerLocalNameSpace</methodname> registriert werden.
</para>

<para>
Sehen wir uns einige Beispiele an (es wird angenommen, dass APPLICATION_PATH dem
<link
linkend="configuration.yaf.directory">application.directory</link> entspricht):
<example>
<title>Konfigurationsbeispiel</title>
<programlisting role="shell">
<![CDATA[
// Angenommen, die folgende Konfiguration steht in der php.ini:
yaf.library = "/global_dir"

// Angenommen, die folgende Konfiguration steht in der application.ini
application.library = APPLICATION_PATH "/library"
]]>
</programlisting>
</example>

Angenommen, der folgende lokale Namensraum ist registriert:
<example>
<title>localnamespace registrieren</title>
<programlisting role="php">
<![CDATA[
<?php
class Bootstrap extends Yaf_Bootstrap_Abstract{
public function _initLoader($dispatcher) {
Yaf_Loader::getInstance()->registerLocalNameSpace(array("Foo", "Bar"));
}
}
?>
]]>
</programlisting>
</example>

Dann die Autoload-Beispiele:
<example>
<title>Beispiel zum Laden einer Klasse</title>
<programlisting role="shell">
<![CDATA[
class Foo_Bar_Test =>
// APPLICATION_PATH/library/Foo/Bar/Test.php

class GLO_Name =>
// /global_dir/Glo/Name.php

class BarNon_Test
// /global_dir/Barnon/Test.php
]]>
</programlisting>
</example>

<example>
<title>Beispiel zum Laden einer Klasse mit Namensraum</title>
<programlisting role="shell">
<![CDATA[
class \Foo\Bar\Dummy =>
// APPLICATION_PATH/library/Foo/Bar/Dummy.php

class \FooBar\Bar\Dummy =>
// /global_dir/FooBar/Bar/Dummy.php
]]>
</programlisting>
</example>
</para>

<para>
Möglicherweise ist aufgefallen, dass alle Ordner mit einem Großbuchstaben
beginnen; sie können in Kleinbuchstaben umgewandelt werden, indem in der php.ini
<link linkend="ini.yaf.lowcase-path">yaf.lowcase_path</link> = On gesetzt wird.
</para>

<para>
<classname>Yaf_Loader</classname> ist auch dafür ausgelegt, die MVC-Klassen zu
laden; die Regel lautet:
<example>
<title>Beispiel zum Laden von MVC-Klassen</title>
<programlisting role="shell">
<![CDATA[
Controller Classes =>
// APPLICATION_PATH/controllers/

Model Classes =>
// APPLICATION_PATH/models/

Plugin Classes =>
// APPLICATION_PATH/plugins/
]]>
</programlisting>
</example>

Yaf erkennt das Suffix einer Klasse (dies ist der Standard; es kann über die
Konfiguration <link
linkend="ini.yaf.name-suffix">yaf.name_suffix</link> auch auf das Präfix
umgestellt werden), um zu entscheiden, ob es sich um eine MVC-Klasse handelt:
<example>
<title>Unterscheidung von MVC-Klassen</title>
<programlisting role="shell">
<![CDATA[
Controller Classes =>
// ***Controller

Model Classes =>
// ***Model

Plugin Classes =>
// ***Plugin
]]>
</programlisting>
</example>

einige Beispiele:
<example>
<title>Beispiel zum Laden von MVC-Klassen</title>
<programlisting role="shell">
<![CDATA[
class IndexController
// APPLICATION_PATH/controllers/Index.php

class DataModel =>
// APPLICATION_PATH/models/Data.php

class DummyPlugin =>
// APPLICATION_PATH/plugins/Dummy.php

class A_B_TestModel =>
// APPLICATION_PATH/models/A/B/Test.php
]]>
</programlisting>
</example>

<note>
<para>
Seit Version 2.1.18 unterstützt Yaf das Autoloading von Controllern auf der
Seite des Benutzerskripts (das heißt, das durch das PHP-Skript des Benutzers
ausgelöste Autoloading, z. B. der Zugriff auf eine statische Eigenschaft eines
Controllers in einem Bootstrap oder in Plugins), aber der Autoloader versucht
nur, das Skript der Controller-Klasse im Ordner des Standardmoduls zu finden,
der "APPLICATION_PATH/controllers/" lautet.
</para>
</note>
Außerdem wird das Verzeichnis durch <link linkend="ini.yaf.lowcase-path">yaf.lowcase_path</link> beeinflusst.
</para>
</section>
<!-- }}} -->

<section xml:id="yaf-loader.synopsis">
&reftitle.classsynopsis;

<!-- {{{ Synopsis -->
<classsynopsis>
<ooclass><classname>Yaf_Loader</classname></ooclass>

<!-- {{{ Class synopsis -->
<classsynopsisinfo>
<ooclass>
<classname>Yaf_Loader</classname>
</ooclass>
</classsynopsisinfo>
<!-- }}} -->
<classsynopsisinfo role="comment">&Properties;</classsynopsisinfo>
<fieldsynopsis>
<modifier>protected</modifier>
<varname linkend="yaf-loader.props.local-ns">_local_ns</varname>
</fieldsynopsis>
<fieldsynopsis>
<modifier>protected</modifier>
<varname linkend="yaf-loader.props.library">_library</varname>
</fieldsynopsis>
<fieldsynopsis>
<modifier>protected</modifier>
<varname linkend="yaf-loader.props.global-library">_global_library</varname>
</fieldsynopsis>
<fieldsynopsis>
<modifier>static</modifier>
<varname linkend="yaf-loader.props.instance">_instance</varname>
</fieldsynopsis>


<classsynopsisinfo role="comment">&Methods;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.yaf-loader')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[not(@role='procedural')])" />
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.yaf-loader')/db:refentry/db:refsect1[@role='description']/descendant::db:methodsynopsis[1])" />
</classsynopsis>
<!-- }}} -->

</section>


<!-- {{{ Yaf_Loader properties -->
<section xml:id="yaf-loader.props">
&reftitle.properties;
<variablelist>
<varlistentry xml:id="yaf-loader.props.local-ns">
<term><varname>_local_ns</varname></term>
<listitem>
<para></para>
</listitem>
</varlistentry>
<varlistentry xml:id="yaf-loader.props.library">
<term><varname>_library</varname></term>
<listitem>
<para>
Standardmäßig lautet dieser Wert <link
linkend="configuration.yaf.directory">application.directory</link> . "/library";
er kann entweder in der application.ini (application.library) oder durch einen Aufruf von
<methodname>Yaf_Loader::setLibraryPath</methodname> geändert werden.
</para>
</listitem>
</varlistentry>
<varlistentry xml:id="yaf-loader.props.global-library">
<term><varname>_global_library</varname></term>
<listitem>
<para></para>
</listitem>
</varlistentry>
<varlistentry xml:id="yaf-loader.props.instance">
<term><varname>_instance</varname></term>
<listitem>
<para></para>
</listitem>
</varlistentry>
</variablelist>
</section>
<!-- }}} -->


</partintro>


&reference.yaf.entities.yaf-loader;

</reference>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
Loading
Loading