Hello, internals!
2016-05-05 9:48 GMT+03:00 Stanislav Malyshev <smalys...@gmail.com>: > Maybe that's what we want to have here - freedom for everybody to invent > their own languages - but I fear the danger of fragmentation here and > also people implementing tons of slightly different incompatible parsers > for ASTs that are generated. We'd have Drupal attributes and Symphony > attributes and Doctrine attributes and Zend attributes and so on, and > each of them would have different semantics. Not sure this would be > good. But maybe it avoids arguing about the syntax now. > AST for attributes is a nice thing for abstracting from the concrete details about how attribute is handling by the concrete implementation. I can see a lot of common with class autoloading - earlier there were a lot of custom loaders, thanks to spl_autoload_register() that defines a stack of callbacks responsible for loading classes by their names. And everyone uses custom class loader, but later PSR-0 and PSR-4 were described and adopted in composer, so now we have one general tool for that. What if we select the same direction with the stack of callback? How it should work: PHP engine stores all attributes in the plain AST without any transformations. This data should be accessible via ReflectionXXX->getAttributes(ReflectionAttribute::RETURN_AST). After that userland library can register a hook as attribute loader: e.g ReflectionAttribute::registerProcessor(SomeHandler::class, $isPrepend = true) or spl_attribute_handler_register(SomeProcessor::class, $isPrepend = true) Each processor is a class with two methods: interface AttributeProcessorInterface { public function supports(Php\Ast\Node $attributeNode) : boolean; /** @return mixed */ public function process(Php\Ast\Node $attributeNode); } After that if we call ReflectionXXX->getAttributes(ReflectionAttribute::RETURN_VALUE) PHP engine will call each processor and asks it if it supports this AST node. If processor supports this node, then engine call it's process($attributeNode) method, returning the result as a result, otherwise looks for another processor. If no processors can handle this AST then PHP can throw an exception about with information about missing processors for attributes. I think this way can give a good start point with possibility to standardize handling of attributes in the future. From the PHP engine side, all attributes are AST nodes that can be processed later on the userland side.