Re: Class and interface location
| From: | larry@garfieldtech.com | Date: | Wed, 19 Jan 2011 16:23:56 +0000 |
| Subject: | Re: Class and interface location | ||
| References: | 1 2 3 4 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-310876@lists.php.net to get a copy of this message | ||
On 1/19/11 10:09 AM, Adam Richardson wrote:
On Wed, Jan 19, 2011 at 8:21 AM, Richard Quadling<rquadling@gmail.com>wrote:That is essentially #3. The static analysis results could easily be cached in a human-editable form, but in practice I don't think that will be viable. The humans who will be running this system will largely be non-PHP-gurus so asking them to validate the accuracy of a giant PHP array dumped to a file is going to be a losing battle. If we're actually building a full graph to determine indirect implementation that would then preclude pre-deriving information per-plugin and just shipping a manifest file with each plugin. (I could be convinced of that as an approach, but that still doesn't solve the indirect implementation problem.)On 19 January 2011 07:46, Adam Richardson<simpleshot@gmail.com> wrote:On Wed, Jan 19, 2011 at 2:07 AM, Larry Garfield<larry@garfieldtech.com wrote:parse3) Static analysis. Instead of reflection, either tokenize or stringclasses,all files to determine what classes implement what interfaces and then cache that information. We are actually using this method now to locateitand it works surprisingly well. Because we never parse code into memoryfinddoes not ever spike the memory usage. However, it is impossible to determine if a class implements a given interface by static analysis unless it declare so itself with the implements keyword. If it does so indirectly via inheritance, either via the class or via the interface, it would notthemselvesit. That necessitates that any "detectable" classes must explicitlylikedeclare their interfaces, even if it is redundant to do so. I don'tthethat approach, but it's the first one that strikes me as even viable.4) Explicit declaration. In this approach we detect nothing and rely onthisplugin developer to do everything. That is, they must provide somewhere (either in code or a configuration file) an index of all classes they offer, the interfaces they implement, and the file in which they live. Whiledevelopermakes the implementation easy, it is a huge burden on the pluginbasis.and I'm quite sure they'll forget to do so or get it wrong on a regularanalysisI'd suggest combining 3 and 4. Build a tool that performs a staticof a group of files and make it easy for developers to use. This toolwouldgenerate the explicit declarations your codebase would utilize when answering such questions as "which classes implement interface foo". The file the static analysis tool generates could be easily hand editable, so developers could tweak it if they see issues (just in case the static analysis tool has bugs early on), or for small plugins, just quick crankouta couple lines by hand. As long as the static analysis tool builds a composite of class hierarchy established in all the files (project wide, at least in terms of the plugin), you wouldn't have to double declare interfaces so they could be detected. Adam
Yeah, inclued looks cool but it looks like a runtime analysis tool, not a static analysis tool. That runs into the same problem as reflection where I'd have to include the whole code base in order to build up the indexes I need. --Larry GarfieldThere is a pecl extension called inclued [1]& [2] which could be used I think. It can be used to produce a list of all the relationships between included files, so a one off pass of all the class files (simply include them) and then retrieve the analysis from inclued. You can now build a class dependency tree from that data and cache it. Pretty much exactly what you need.Richard, While inclued performs a nice analysis of the files included at a given stage of a script, I don't see that it performs a static analysis of the PHP contained within the files so Larry could use it to detect the interfaces implemented in a given set of PHP files. I looked at the pages: http://docs.php.net/manual/en/inclued.examples-implementation.php http://docs.php.net/manual/en/function.inclued-get-data.php I'm curious about this feature myself, so if I missed something, please let me know. Thanks, Adam