I definitely agree that this would be a cool thing to have.  Today PEAR
packages do all of this with PHP code, a more tightly integrated package
concept would be very nice.  Comments below.

Stanislav Malyshev wrote:
> 
> 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?

Since it just returns if the package is already loaded, I think
package_use() or use_package() would be better names for this one.  To
me, "load" is unconditional.

> 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.

Yes!  This function could be a real problem-solver for those with
less-than-helpful ISPs.

> 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.

I think packages should be able to contain both PHP code files and
extension libraries.  This would save coders a lot of hassle, and would
be a great feature to have when extensions start moving from php4 to
pear/PECL.

It would be interesting to compare the performance of an XML-based
package definition file and a plain-text one.  If the overhead is
acceptable I think we should go with PEAR's package XML format.  If the
overhead is too big I think your format is fine.

My suggestion is putting this thing in php4/ext/pear.  I want to move
some other code there too, but this would be a good start.

 - Stig

-- 
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