Best I can figure, it's a very verbose description of a process analogous to using mod_rewrite to parse requests ending in .class and pass them off to a wrapper that instantiates the eponymous class (i.e., about 2 minutes of programming).
But it was a little hard to get through, so I may have misread it. miguel On Sun, 28 Apr 2002, John Holmes wrote: > Can someone translate this to English? > > > -----Original Message----- > > From: Peter [mailto:[EMAIL PROTECTED]] > > Sent: Saturday, April 27, 2002 7:21 PM > > To: [EMAIL PROTECTED] > > Subject: [PHP] class PHP > > > > The text of this proposal, test code, and updates live at > > petermoulding.com/class. I place it here for discussion of the best > > approach before people build code. > > > > Class PHP > > > > An invention for a classier PHP. > > > > This invention uses PHP classes as Web pages. The invention can be > > implemented as a wrapper around PHP or as an enhancement to PHP. In > > Apache 2, the invention can be implemented as a filter to precede PHP. > I > > will give a quick outline of the requirement, then sketches of > > implementations, then detailed examples prototyped using PHP. > > > > The invention is named class. An Apache implementation could be a > module > > named class. If you write code to implement this invention, suffix the > > project name with your name as in class_John. > > > > To prevent a rapacious company copyrighting this invention using the > > excuse that it is a business process or anything else they can > > copyright, I declare my copyright on everything in this invention and > > any processes derivable from this. Please make your code > implementations > > GPL, www.gnu.org/copyleft/gpl.html, and mention my page at > > petermoulding.com/class. > > > > Invention Requirement > > The main requirement is to replace PHP's page input with invented > input. > > > > Here is a file named any_class.class that containing a PHP class named > > any_class: > > <?php > > class any_class > > { > > function any_class() > > { > > /* code to build a Web page. */ > > } > > } > > ?> > > > > Here is a Web page containing a PHP script to build the entire page > > using the PHP class any_class: > > <?php > > include_once("any_class.class"); > > $any_class = new any_class(); > > ?> > > > > The invention makes PHP initiate any_class.class as if any_class were > > included and instantiated by the example Web page. > > > > PHP Wrapper > > > > The invention could be implemented as a module for Apache or another > Web > > server by writing a wrapper for PHP. The wrapper would accept a call > > from Apache then pass the call on to PHP so PHP could perform 100% > > unaltered as if PHP were called direct from Apache. > > > > The module would look for class requests with a page of the form > *.class > > then intercept the URL and prepare to pass invented input to PHP. The > > Apache configuration parameters can ensure all requests for class go > to > > class and only requests for class to class. In a mixed class/PHP > > environment, the requested class can go to class and the PHP requests > > can go direct to PHP. There could also be a check in class for a class > > file so that all requests are directed to class and class processes > just > > those with a matching class file. > > > > When class finds a valid class request, class builds a PHP Web page > that > > includes the class file and initiates the class. To make PHP read the > > invented Web page, you could trap PHP's Web page read and substitute > the > > invented page. As PHP has to access files within the constraints of a > > Web server, the access technique could vary from release to release > and > > across Web servers. I will describe two quick implementation > > possibilities. > > > > If PHP reads files via Apache's file read functions (or an equivalent > on > > other web servers), class gets to view all file requests from PHP to > > Apache and monitor all replies. Class can then pass the invented page > > back to PHP without the request reaching Apache. PHP remains untouched > > by class. > > > > Where a Web server does not provide file access functions or PHP > chooses > > to not use those functions, class would need a modification to PHP to > > intercept file reads. The interception depends on the exact > compilation > > of PHP and would be in the form of a wrapper around a file access > > routine in PHP. The wrapper (or interception layer) needs to be at a > > level where the code can see file names and subvert the whole file > read > > process. Interception at this level requires PHP release dependent > > coding and is a step toward the PHP enhancement described next. > > PHP Enhancement > > A PHP enhancement would be an implementation of the invention direct > > within PHP's code so that PHP can react to class requests in > conjunction > > with an external process or without an external process. The ultimate > > enhancement would be to incorporate the whole invention within PHP so > > there are no additional installation steps required. > > > > A PHP enhancement could use a wrapper as described in PHP Wrapper or > the > > Apache 2 filter described next but use those devices just to trigger > > class processing then perform the whole processing within PHP. This > > approach has the advantage that the processing is independent of the > > trigger method and the trigger method is free from processing code. > > > > The PHP enhancement could discover the need for class processing by > > whatever method suits the web server environment. The enhancement > would > > then verify the action is valid within constrains specified in > php.ini, > > verify a class file is available, and invoke the class file as if from > > an invented Web page of the same name as the class file. > > Apache 2 Filter > > > > To implement this idea as an Apache 2 filter, you need a link to PHP > > that lets PHP know your code will provide the Web page input. Your > code > > then invents a Web page of the same name as the class file and passes > > the invented page to PHP. The Apache Notes field looks like a good > > vehicle for passing the invented page. > > > > PHP has to discover the Web page will arrive in the Notes field or via > > another mechanism of your invention. That means a modification to PHP > > and something in php.ini to prevent accidental use of the modification > > in sites not using your code. The least PHP dependent method would be > to > > invent the page in your code and enhance PHP with a single trigger to > > make PHP read the input Web page from your mechanism. The approach > > minimises changes to PHP but makes the process Web server dependent. > The > > PHP enhancement described in a previous page is more PHP dependent but > > less Web server dependent. > > > > Allow for other filters using the Apache Notes field. Wrap your > invented > > page in a simple XML tag that PHP can recognise within the Notes > field. > > > > Detailed Example > > > > Here is a file named any_class.class that containing a PHP class named > > any_class: > > <?php > > class any_class > > { > > function any_class() > > { > > /* code to build a Web page. */ > > } > > } > > ?> > > > > This class contains a constructor that builds the whole Web page using > > any combination of code, functions and classes valid within PHP > classes. > > I copied all the Web site construction code from one Web site in to a > > class/function wrapper and initiated Web page construction without > > error. In other tests there were some global variables that needed > > mention in a global statement within the outside function. If the > global > > communication within an application is a variable named $site, the > above > > example becomes: > > <?php > > class any_class > > { > > function any_class() > > { > > global $site; > > /* code to build a Web page. */ > > } > > } > > ?> > > > > As the authors switch to 100% class based coding, global variables > > disappear in favour of a structure of variables with the class > > structure. > > > > Now for a more detailed look. The following code is a PHP > implementation > > of a PHP wrapper built by pointing the Web server at pages of type > .html > > which then contain a script to call the appropriate class from a > > parallel file of type .class. In this version there is no code within > > the Web server so there has to be two files. Once the example is > > translated to C and added to a Web server as a module, the example > code > > becomes the content of a virtual Web page that is passed to PHP but > not > > stored on disk. > > > > The first part of the code simply extracts the page name from PHP_SELF > > and saves the name in $class_new_page. There are many ways to derive > the > > page name from server variables. Your technique will vary depending on > > the Web server, the release of PHP and the options in php.ini. The > > example happens to work on all the variations of PHP and Web servers I > > currently use. The example also lets me remove the file type for known > > file names while leaving in name parts that happen to contain dots. > > > > The second part of the code prepares variables for use in the > > constructor class. I used a class that does not know about URL or form > > variables so I copy them in to an array for the class. This code is > not > > needed if your class knows it will be initiated as the start of a > page. > > You only need this type of code if you want to use the class as both > the > > start of a page and as a class within other code. > > > > You could pass URL variables to the class in the order read from the > URL > > but you do not control the URL order. You could leave all the > variables > > out and let the class find the variables but the class would have to > > know where to look, in the parameters of the constructor function or > in > > external variables. I use this part of the code to translate external > > variables to a form the class understands and will later convert the > > class to read direct. A better approach would be to enhance PHP to > read > > named parameters. > > > > The third part of the code initiates the class. Initiation includes > both > > class file inclusion and class instantiation. I use include_once() to > > prevent multiple inclusions. Your Web server module should use > > include_once() for version of PHP that have include_once(). > > > > The variables are prefixed $class_new to reduce clashes with existing > > code. That means I can mix this code with legacy PHP code on sits > during > > conversion. In your Web site module the variables are external to PHP > so > > do not clash with anything within the class or subsequent code. > > > > <?php > > // Extract page name: > > $class_new_parts_page = explode(".", array_pop(explode("/", > > str_replace("\\", "/", $HTTP_SERVER_VARS["PHP_SELF"])))); > > if(in_array($class_new_parts_page[count($class_new_parts_page) - 1], > > array("html", "php"))) > > { > > array_pop($class_new_parts_page); > > } > > $class_new_page = implode(".", $class_new_parts_page); > > > > // Prepare variables: > > $class_new_variables = $HTTP_GET_VARS; > > foreach($HTTP_POST_VARS as $class_new_key => $class_new_value) > > { > > $class_new_variables[$class_new_key] = $class_new_value; > > } > > > > // Initiate the class: > > include_once("./" . $class_new_page . ".class"); > > $$class_new_page = new $class_new_page($class_new_variables); > > ?> > > > > The function initiation can be implemented in a function so all > > subsequent classes are initiated in a similar fashion. I use the > > following simple function because it works with existing classes on a > > development site. Once the existing site and classes are redeveloped, > > the "./" prefix and ".class" suffix will be replaced by named > constants. > > At that point the function will serve little purpose so will be > dropped. > > in some other sites the function may be expanded to extract dynamic > > classes from content databases. A logical extension of this invention > is > > to add code extraction from an XML database, something I describe in > > another document. > > > > // A function to initiate a class: > > function class_new($class_new_class, $class_new_variables, > > $class_new_prefix = "./", $class_new_suffix = ".class") > > { > > global $$class_new_class; > > include_once($class_new_prefix . $class_new_class . > > $class_new_suffix); > > $$class_new_class = new $class_new_class($class_new_variables); > > } > > ?> > > > > Implications > > > > By now you realise the class will have the same name as the page so > will > > not suit sites based on many pages with different names. It is also of > > no interest to people to write HTML pages then insert small portions > of > > PPH code. This invention is for sites using pages generated by PHP > code > > so suits sites using dynamic content management. It suits sites that > > have a small number of pages presenting varied data. > > > > Your site might have one page for registration, another for logging in > > then a single page/script that provides a shopping system while > another > > single page/script provides a search facility. Make the search a class > > and use this invention to initiate the class. > > > > Once you develop dynamic content management, your sites end up as a > list > > of scripts delivering what looks like a series of intelligent pages. > The > > HTML pages execute PHP scripts and add nothing. This invention removes > > HTML layer between your class based scripts and the Web server. > > > > -- > > PHP General Mailing List (http://www.php.net/) > > To unsubscribe, visit: http://www.php.net/unsub.php > > > > -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php