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]

Reply via email to