Below is the proposal for PHP packaging extension. The intentions is for PHP to have the package system kind of like what Perl and other languanges have. The comments and suggestions are most welcome, as usual. Especially the experience with packaging system from other languages.
=============== Name: Package Extensions Draft Version: 1.0 Author: Stanisval Malyshev <[EMAIL PROTECTED]> Goal: ==== Create a system that will allow to create and conveniently handle PHP code "bundles", containing one or more PHP code files bound by the common function. Requirements: ============ The system should: * allow convenient loading of the whole package with the single statement * allow convenient checking if the package is loaded * allow the user to conveniently pack the package and to describe relationships between the packages * this is not meant to replace include() and include_once() but to add functionality that will allow more systematic view on the PHP code tree * the system should sit well with future namespace implementation, allowing packages to use the benefits of the namespaces The system is meant to be implemented as a PHP extension. On the best of my knowledge, it can be implemented without interfering with any existing code and without needing any code modification in any other parts of PHP/Zend. Proposed functions: =================== package_load("Name") -------------------- Loads the package with name "Name". The loading is done in the global scope (as opposed to include()). Returns true on success. If the package with this name was loaded, it just returns true, while doing nothing. If the package cannot be found, it returns error. TBD: fatal error or not? package_is_loaded("Name") ------------------------- Returns true if the package is loaded, false otherwise. package_set_path("path") ------------------------ Sets the package path for looking for packages. The default is the include path. Technology: ========== Package is located and loaded in the following way: 1. First, the package location name is determined. If the name does not contain :: signs, the package location name is the package name. If the package name contains ::, each :: component is a subdirectory, i.e. Foo::Bar::Baz produces the location name of Foo/Bar/Baz (just like in Perl). 2. Package location name is prepended with each directory in the package path. The '.pdef' extension is added to the path. If a file with such name exists, this is a package definition file, which is parsed according to 3. If not, the '.php' extension is added to the above path. If a file with such name exists, it is considered to be the main file of the package and is included with global scope. This file should require_once the rest of the files. 3. The package definition file has format like the following: Package: Foo::Bar Version: 3.14.15 Requires: PEAR Requires: DB::MySQL Files: boobar.php boo.inc classes/class.A.inc classes/class.B.inc Package: line defines the name of the package, should be the same as is required (as a sanity control measure). Version: is not used in the meantime. Requires: line defines that this package depends on other package, which should be loaded before this package is loaded. This line can be repeated a number of times. Files: line marks the start of the file list. The next lines of the file, until the end, will be package filenames, one per line. The pacthes are relative to the package directory. The files are included (just like include()) in the global context and executed, one by one. It is not recommended to put any global-scope code but definitions and variable definitions into these files. -- Stanislav Malyshev, Zend Products Engineer [EMAIL PROTECTED] http://www.zend.com/ +972-3-6139665 ext.115 -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]