123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- eZ Components - Base
- ~~~~~~~~~~~~~~~~~~~~
- .. contents:: Table of Contents
- Introduction
- ============
- The Base component provides the basic functionality, such as autoloading, that
- all eZ Components need to function properly. The Base component needs to be
- loaded specifically. Base can also autoload external class repositories from
- outside the eZ Components.
- Aside from the autoload functionality, the Base component also contains a number of
- generic Exception classes that all inherit from the ezcBaseException class.
- Installation
- ============
- The installation and configuration of the eZ Components environment is
- described in a separate article. Please refer to the `Components Introduction`_
- for instructions on installation and configuration of the eZ Components library
- and the Base component.
- .. _Components Introduction: ../../../../zetacomponents/documentation/install.html
- Usage
- =====
- Debugging
- ---------
- By default the ezcBase component's autoload mechanism will not throw an
- exception when an autoload class can not be found. In some cases (during
- development) it is useful to have an exception with detailed information
- about which autoload files were searched for, and in which directories.
- ezcBase supports an option that enables this behavior::
- <?php
- $options = new ezcBaseAutoloadOptions;
- $options->debug = true;
- ezcBase::setOptions( $options );
- ?>
- **Warning**: Exceptions are ignored when they are thrown from an autoload()
- handler in PHP. In order to see the exception message that is thrown when a
- class can not be found, you need to catch the exception *in* the autoload()
- handler. Your autoload() function could then look like::
- function __autoload( $className )
- {
- try
- {
- ezcBase::autoload( $className );
- }
- catch ( Exception $e )
- {
- echo $e->getMessage();
- }
- }
- Preloading
- ----------
- The default autoload policy of the eZ Components is to load every class
- file on demand only. It is also possible to load all classes of one
- component at the same time, when one of the component's classes is
- requested for the first time. You can change this behavior with the
- "preload" option that is available through the ezcBaseAutoloadOptions option
- class. You can turn preloading on with::
- <?php
- $options = new ezcBaseAutoloadOptions;
- $options->preload = true;
- ezcBase::setOptions( $options );
- ?>
- Please note that preloading will *not* be done for Exception classes.
- Adding class repositories located outside eZ Components to autoload system
- --------------------------------------------------------------------------
- It can be useful to add repositories of user-defined classes to the eZ
- Components autoload system. The ezcBase::addClassRepository() method can be
- used to perform this task. You need to arrange the desired external classes
- in a class repository. That is, make sure that classes and corresponding
- \*_autoload.php files are named and placed according to the explanations below.
- After they are in the proper structure, you can call addClassRepository() with
- the proper parameters before you use the external classes.
- External classes will then be loaded by autoload system.
- ezcBase::addClassRepository() takes two arguments:
- - $basePath is the base path for the whole class repository.
- - $autoloadDirPath is the path where autoload files for this repository are found.
- The paths in the autoload files are *not* relative to the package directory
- as specified by the $basePath argument. In other words, class definition files will
- only be searched for in the location $autoloadDirPath.
- Consider the following example:
- - There is a class repository stored in the directory "./repos".
- - Autoload files for this repository are stored in "./repos/autoloads".
- - There are two components in this repository: "Me" and "You".
- - The "Me" component has the classes "erMyClass1" and "erMyClass2".
- - The "You" component has the classes "erYourClass1" and "erYourClass2".
- In this case, you need to create the following files in "./repos/autoloads".
- Note that the prefix to _autoload.php ("my" and "your") in the filename is the
- first part of the classname (excluding the lowercase classname prefix - "er").
- Content of my_autoload.php:
- .. include:: repos/autoloads/my_autoload.php
- :literal:
- Content of your_autoload.php:
- .. include:: repos/autoloads/your_autoload.php
- :literal:
-
- The directory structure for the external repository is then: ::
- ./repos/autoloads/my_autoload.php
- ./repos/autoloads/your_autoload.php
- ./repos/Me/myclass1.php
- ./repos/Me/myclass2.php
- ./repos/You/yourclass1.php
- ./repos/You/yourclass2.php
- To use this repository with the autoload mechanism, use the
- following code:
- .. include:: tutorial_example_01.php
- :literal:
- The above code will output: ::
- Class 'erMyClass2'
- Class 'erYourClass1'
- Lazy initialization
- -------------------
- Lazy initialization is a mechanism to load and configure a component, only
- when it is really used in your application. This mechanism saves time for
- parsing the classes and configuration, when the component is not used at all
- during one request. The implementation in ezcBaseInit may be reused by other
- applications and components, like the following example will show.
- .. include:: tutorial_lazy_initialization.php
- :literal:
- The example shows a random class implementing the singleton pattern, which may
- be some database connection handler, or anything similar in your case. The
- getInstance() method shows a typical PHP 5 implementation except the
- additional line 14, which checks, if a configuration callback was provided
- earlier and configures the newly created instance. If no configuration
- callback was provided, nothing will happen. The customKey is used to receive
- the right callback from ezcBaseInit and needs to be known by the user, who
- wants to define a configuration callback for your class.
- In line 32 the class used to configure your instance on creation is defined.
- The first parameter is the key used earlier in the getInstance method, to
- reference the right class, and the second parameter is the name of your
- configuration class.
- The configuration class beginning in line 22 just needs to implement the
- ezcBaseConfigurationInitializer interface, which defines one
- method: configureObject(). This method will be called with the object to
- configure as a single parameter. In the example, a new public property on the
- customSingleton instance is created, which will be echo'd later to show the
- success of the configuration.
- The configuration itself will not happen before the actual instance is created
- in line 35 performing the static call on customSingleton::getInstance(). The
- var_dump() in the following line shows, that the property value is set and
- contains the earlier set value (int) 42.
- File Operations
- ---------------
- Finding files recursively
- `````````````````````````
- This example shows how to use the ezcBaseFile::findRecursive() method:
- .. include:: tutorial_example_02.php
- :literal:
- The code in this example searches for files in the ``/dat/dev/ezcomponents``
- directory. It will only include files that match *all* patterns in the
- $includeFilters array (the second parameter). Files that match *any* of the
- patterns in the $excludeFilters array (the third parameter) will not be returned.
- In other words, the code above searches for files in the ``dat/dev/ezcomponents``
- directory, which are in the ``src/`` directory and end with ``_autoload.php``,
- except for files that are in the ``/autoload/`` directory.
- Removing directories recursively
- ````````````````````````````````
- This example shows how to use the ezcBaseFile::removeRecursive() method:
- .. include:: tutorial_example_03.php
- :literal:
- This code simply removes the directory ``/dat/dev/ezcomponents/trash`` and all
- of its files and sub-directories.
- **Warning: Use this function with care, as it has the potential to erase
- everything that the current user has access to.**
- Overloading the callback
- ````````````````````````
- The ezcBaseFile::findRecursive() method internally uses the
- ezcBaseFile::walkRecursive() method to do the actual recursing. The callback
- method ezcBaseFile::findRecursiveCallback() is then responsible for collecting
- the data. In case you want to do additional things, such as printing progress,
- you can either call walkRecursive() yourself with a callback function of your
- choice, or overload the ezcBaseFile class and provide a new
- findRecursiveCallback() method. The code below uses
- ezcBaseFile::walkRecursive() directly in order to display dots for when ever it
- finds a new directory:
- .. include:: tutorial_example_04.php
- :literal:
- ..
- Local Variables:
- mode: rst
- fill-column: 79
- End:
- vim: et syn=rst tw=79
|