hi, Please put it in the wiki :)
On Mon, Dec 6, 2010 at 8:38 PM, Loon, Reinier van <reinier.van.l...@gmail.com> wrote: > RFC __autodefine / spl_autodefine > > This proposal proposes to introduce one function for automagically > defining missing definitions at run time. > The reader should have a reasonable level of PHP knowledge and > computer languages when reading this proposal. > Note: Whenever __autodefine is used, also spl_autodefine is meant. > > Current situation > > PHP currently supports defining missing classes by the __autoload function. > This solution mimics the class loader concept from Java. > Once defined, undefined class functions (methods) can be emulated by > using __call and __callStatic. > It can be argued that __autoload is enough for the future if the > future is object-oriented. > > > Proposition > > While very useful in its own right __autoload is limited: only classes > can be loaded dynamically. > However, there is still a lot of code that is either mixed functional > and object-oriented or only functional. > Excluding that code from such a solution makes life very hard on > everyone maintaining mixed code bases. > It is understandable that by denying this function to non-object > oriented code an incentive exists for maintainers and developers to > switch to object-oriented programming. > Although understandable it is not acceptable, for the following reasons: > 1) There are enough people maintaining and writing code in a perfect > manner that do not grasp object orientation > 2) Any large code base should have the possibility to slowly migrate > and not be coerced into an object oriented way of working > 3) Even if this coercion would work, it would not guarantee the > solution is object-oriented, only that it is coded in classes > > So, it can be stated that a number of language constructs are missing > the option to autoload. > > From a conceptual point, tokens in a sequence of statements refer to > definitions. The implementation of almost all run time environments > demands that a definition exists before first referenced. __autoload > changed this rule by allowing classes to be defined when the execution > of a statement hits on an undefined class. This behaviour should be > generalized. > > Generally, it can be said that PHP needs a mechanism for automagically > defining undefined elements. The proposed name for that function is > __autodefine. The parameters to this function would be $name and > $type. The type parameter would refer to all the existing elements > that are defined. Probably the maximal set of language constructs that > could be supported are: T_ARRAY, T_CLASS, T_CLASS_C, T_CONST, > T_FUNCTION T_FUNC_C, T_INCLUDE, T_INCLUDE_ONCE, T_INTERFACE, > T_METHOD_C, T_NAMESPACE, T_NS_C, T_REQUIRE, T_REQUIRE_ONCE, T_USE, > T_VAR, T_VARIABLE. The author believes the minimal solution should > support at least T_FUNCTION, T_CLASS, T_INTERFACE and include > (T_INCLUDE, T_INCLUDE_ONCE, T_REQUIRE, T_REQUIRE_ONCE). Namespaces > will be part of the name as is the case in call_user_func. > > The relation with the current implementation is that __autoload equals > __autodefine( $name, T_CLASS ) with the exception of the optional > file_extensions parameter. __autoload need not be changed and > __autodefine can live alongside __autoload. Author believes __autoload > should be marked 'deprecated'. > > > Minimal solution proposal > > __autodefine( $name, $type ) > > $name is the string of the missing definition > > $type is the integer identification of the type and defined by constants. > > > $type constant $name format > name examples > > T_FUNCTION [namespace][class name][::|->]function name > a\b\foo, System::boot, SomeClass->getWidth > T_CLASS [namespace]class name > Image, ns\Image > T_INTERFACE [namespace]class name Image, ns\Image > T_INCLUDE file name > somefile, ../somefile, \includes\Somefile > T_INCLUDE_ONCE file name > somefile, ../somefile, \includes\Somefile > T_REQUIRE file name > somefile, ../somefile, \includes\Somefile > T_REQUIRE_ONCE file name > somefile, ../somefile, \includes\Somefile > > > Code examples > > foo(b); // __autodefine( 'foo', T_FUNCTION ) > > p = new PHP(); // __autodefine( 'PHP', T_CLASS ) > > include 'piece' // __autodefine( 'piece', T_INCLUDE ) > > ons\foo(); // __autodefine( 'ons\foo', T_FUNCTION ) > > p->im(); // __autodefine( 'PHP->im', T_FUNCTION ) > > p->cm(); // __autodefine( 'PHP::cm', T_FUNCTION ) > > > Advantages > > A whole new array of possibilities opens up for managing code, both at > run time and both at design time (development). Code is no longer > bound to file containers. Small pieces of code can exist on their own. > At run time only the code pieces that are needed for execution are > defined. No longer parsing of complete files when only 5 code lines > will be executed. A parse error in a file not relevant to the piece of > code that will be executed will not prevent execution anymore. By > splitting code up, developers can work side by side on the same code > base, every developer on a set of code pieces, much smaller than the > files now and thus reducing (locking) conflicts. Code pieces can be > tested standalone and accepted. Progress is measurable on function > level. Requirements can be tied to their functions. Basically, a lot > of metafunctions are suddenly possible because splitting up code in > smaller pieces has become a workable solution. Code could be for > example managed like in a wiki, with page (= code piece) revisions > etc. If needed the code pieces can be assembled into any number of > files for delivery. An extreme solution is assembling all the code > pieces into a zip file and having a run time implementation of > __autodefine that picks definitions from a zip file. While the same > code is available during development in a wiki. Large codebases can be > split up over time into more manageable pieces giving the developers > renewed control over their application. The __autodefine function will > enable all sorts of new ways of managing code and work processes. > Security can be enhanced enormously as it is not common anymore where > definitions will come from and how they are decrypted. Even if someone > gets access to the source code (outside the web root), it might be > scrambled. Also insight into the system can be obtained by observing > definition patterns that can be gathered during the autodefine > processing. > > > Disadvantages > > Initially execution may be slower. However, this can be countered with > different implementations for __autodefine at production time and > development time. The author also believes that others will find ways > to counter this disadvantage by using caching or keeping definitions > in memory inbetween executions. > > > Conclusion > > The minimal solution to support all definitions would be the function > __autodefine( $name, $type ). From there on, every developer can > determine his/her own strategy for automagically defining > implementations. The __autodefine function enables developers to split > code up into smaller pieces as before while at the same time make it > manageable by removing the need to include all these functions. By > splitting code up in smaller pieces more developers can work together > on one (1) code base. A parse error in a function that is not called > will not damage the run time as is the case in the current > implementation where many functions are grouped into files for reasons > of manageability. __autodefine also enables developers to utilize all > sorts of autodefinition mechanisms like retrieving definitions from > the file system, the network, a zip file or even a database. Even > multiple sources can be used, runtime versioning mechanisms can be > utilized, code decryption on the fly is possible. It would be even > interesting if the autodefinition could be in the form of byte codes. > > The __autodefine function is generic enough that the same concept can > be applied in most other languages. > > The request is to supply at least the minimal __autodefine in a very > near future version of PHP. To be complete and consistent spl_ > autodefine_ call, spl_ autodefine_ extensions, spl_ autodefine_ > functions, spl_ autodefine_ register, spl_ autodefine_ unregister and > spl_ autodefine should be defined (although considered not necessary > according to the author). > > Reinier van Loon > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > > -- Pierre @pierrejoye | http://blog.thepimp.net | http://www.libgd.org -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php