PHP framework (HMVC, global context, ORM...)

Hi.

I would to represent an share a PHP-Framework. Base concepts of it: project pattern - kind of HMVC (Hierarchical Model View Controller); global context container for access to config data, input data and DI; ability to create Web- and CLI-applications, micro-services and complex module-builded projects; own ORM and so on…

Framework itself: https://github.com/igor1999/gi

Project pattern: https://raw.githubusercontent.com/igor1999/gi/master/docs/pattern.jpg

PS If you would to test signification, please write me in private, and I’ll send you login/password.

1 Like

Why are there no automated tests? :eek:

1 Like

Becose I am only single person. I have writen framework, demo-projects… And I would like to know, whether or not my product has any perspective. In case yes, I’ve ready to create Unit-Tests, docs and so on…

Could you please explain why you’ve created it? What does it have that Laravel, Symfony, CodeIgniter, etc don’t?

2 Likes

Above I’ve try to describe main Concepts, that I find to important to realise.

  1. Component-oriented Framework. “Component” means any little frame in Web-Document: Table, List, Form, Menu…

  2. Global context.

  3. Call - object, that incapsulates Input data (web-request or CLI-Arguments, Server and OS environment), Output data if required (web-response), middleware.

If you are looking for a review of your framework, do you have anything specific you would like members’ input on? Do you have any concerns about the framework? What kind of discussion would you like members to provide here?

1 Like

I am software developer, but not a busynessman. I would like to share my framework, but I have no idea how. I thought, theme by specific community is the right way.

In your FAQ there is a proposition to tell more about… But framework is really big stuff. Above I’ve try to describe a main conceps. If somebody has a questions about, I’ll try to answer it. Any critic acceptable.

3 Likes

This is not new. The Yii Framework has had this for years. They call them Widgets instead of Components, but the principle is the same. Also the way it set up in GI with the entire XHTML building is quite hard to read. Not saying it is bad, but it is hard to read. Most projects I’ve worked in HTML was actually the easiest part of the project, in GI it seems to be the most complex part. Why all these PHP classes to represent different HTML nodes, why not return an HTML string from the Components, possibly using some helpers for escaping values.
This is also a concern, none of your code seems to be calling htmlentities to escape input, meaning your framework is most likely vulnerable to XSS attacks. Unless you’ve solved this some other way I’m missing?

Yii has this as well, so this is not new. Also, global contexts are generally not a very good idea because it makes things unpredictable and very hard to test. There’s a reason Symfony and Laravel don’t have this :wink:

Symfony has Request/Response as well, which is indeed tight to HTTP. Most other frameworks use PSR-7 for this in some form or other.
This is just mapping from strings to objects and not really a selling point for any framework in my opinion.

Beside all that, your framework doesn’t play well with composer since it tells PHP to only use its autoloader, meaning there is no room for the composer autoloader to act as well. Since almost everything is running on composer these days playing well with it is a real must.
You can then also use composer for your autoloading and drop your custom autoloader.

composer.json autoloading example:

{
   "autoload": {
      "psr-4": {
         "GI\\": "GI"
     }
   }
}

Also, I ran PHPStan on your framework, which does static analysis to check that code behaves like it says it does (returns correct types etc) and there are quite some errors. For example:

 ------ ---------------------------------------------------------------------------------------------------------------------------------------------- 
  Line   Component/Paging/Dropdown.php                                                                                                                 
 ------ ---------------------------------------------------------------------------------------------------------------------------------------------- 
  48     Property GI\Component\Paging\Dropdown::$view (GI\Component\Paging\View\DropdownInterface) does not accept GI\Component\Paging\View\Dropdown.  
 ------ ----------------------------------------------------------------------------------------------------------------------------------------------

This means that your GI\Component\Paging\View\Dropdown class does not implement the GI\Component\Paging\View\DropdownInterface, but somewhere the code assumes that it does.

There are also undefined constants:

 ------ ------------------------------------ 
  Line   Email/Body/Multipart/Multipart.php  
 ------ ------------------------------------ 
  13     Constant TYPEMULTIPART not found.   
 ------ ------------------------------------ 

 ------ ------------------------------ 
  Line   Email/Body/Text/Text.php      
 ------ ------------------------------ 
  132    Constant TYPETEXT not found.  
 ------ ------------------------------

And some code refers to classes that don’t exist:

------ ------------------------------------------------------------------------------------------------------------------------------------------- 
  Line   XHTML/XML/Writer/Replicator/Factory/Factory.php                                                                                            
 ------ ------------------------------------------------------------------------------------------------------------------------------------------- 
         Class GI\XHTML\XML\Replicator\Factory\Factory was not found while trying to analyse it - autoloading is probably not configured properly.  
 ------ -------------------------------------------------------------------------------------------------------------------------------------------

In total PHPStan found 265 of these errors.

I hate to be the bringer of this message, because the code looks like you’ve spend a lot of time on it, but as it stands I don’t see a reason to use it. It has no selling point that makes it stand out from other frameworks, there are no tests so I can’t be sure anything works as expected, the code has a lot of errors with typing, and it doesn’t play with composer.

If there is something unique that I’m just missing I’d love to hear it. Convince me :slight_smile:

2 Likes
  1. Component - package that includes PHP-classes for View, Controller, View-Model extensions also extern resources (js, css, images) and phtml-templates. Package cares about it frame from View level till Persistence level (see pattern scheme).

  2. HTML generated itself with DOM-objects, also with phtml-templates. They both have all types of escapers (HTML-text, HTML-Attributes, CSS-attributes, JS, URL). In DOM-objects HTML-text automatically escaped.

  3. I see no problems to test global context becose of trait with dynamic methods. You can easy to mock method getApplicationContext, for example.

  4. Clear middleware is not a new concept. But incapsulation in object brings some advantages.

  5. I’ve fixed Dropdown, thank’s. This class was implemented ChainInterface that’s why I’ve not found this error. But… I have an inspection in PHPStorm and it shows me no errors. Also in demo-project there is no errors too.

  6. Absolutely no problem to use composer if you mind.

So… I can’t convince you. Convince at first yourself that my product not obligatory bad.

I got that. I just don’t get why we need yet another implementation.

Ok that sounds good.

Right, testing the global context from the point of view from a single component in isolation is indeed very doable. The trouble begins when components start to use the global context to talk to each other, but a third component comes along and uses the same part of the context to do its thing. Then there no longer is a clear boundary of who is doing what with the global context and why. Stuff like this is notoriously hard to debug. Also see https://hackernoon.com/5-benefits-of-immutable-objects-worth-considering-for-your-next-project-f98e7e85b6ac

Kind of trivial though. Not something I’d need a framework for.

Just because you don’t see any errors doesn’t mean they’re not there. Maybe the demo projects don’t touch some parts of the code, or don’t use them in a way that appears would work but doesn’t. With open source you have to be very careful that everything is public will be used, and will be used in ways you didn’t expect.

At any rate, in case you’re interested here is the entire list of errors from PHPStan: https://gist.github.com/rpkamp/fde4af12914cced3cfaf2f95634bdbb9

Ah right, this works:

<?php

// Load composer's autoloader
require __DIR__ . '/vendor/autoload.php';

use GI\Autoloader\Autoloader;

require_once __DIR__ . '/GI/Autoloader/resources.php';

// Load GI's autoloader
(new Autoloader())->setExceptionIfNotFound(false);

But without the ->setExceptionIfNotFound(false); part it doesn’t work, because GI will prevent the composer autoloader from also having a say in loading the class.

Is there a particular reason why your project doesn’t have a composer.json that defines exactly what it needs in terms of PHP version, extensions, etc, and hands off autoloading to composer?

I just don’t get why we need yet another implementation.

Becose it is better? I don’t know Yii, sorry. But Zend and Symphony also sometimes look very similar and?..

Right, testing the global context from the point of view from a single component in isolation is indeed very doable. The trouble begins when components start to use the global context to talk to each other, but a third component comes along and uses the same part of the context to do its thing…

Context class (instance) bound to it application class or interface. Context container saves mapping of application classes/interfaces to context classes. If second application class needs similar context, it should be created another context that extends first.

Kind of trivial though. Not something I’d need a framework for.

In Laravel or Zend-Expressive you include new middleware to config. In GI you create a new Call class. What is the difference? What is the difference between imperative and object-oriented programming?

Just because you don’t see any errors doesn’t mean they’re not there.

I’ll see errors, thank’s. But TYPEMULTIPART, for example, is predefined PHP-constant. So should I trust some tool that doesn’t see this constant?

Ah right, this works:

Why use you framework autoloader at all, if you would like to use composer? There is no rule about. You could use framework autoloader or not, by your decision.

So… First error in PHPStan:

Method GI\Application\Application\Micro\Application::getCLICalls() should return array<GI\Application\Call\CLI\CallInterface> but returns array<GI\Application\Call\CallInterface>.

Method itself:

    /**
     * @return CLICallInterface[]
     */
    protected function getCLICalls()
    {
        $f = function(CallInterface $call)
        {
            return $call instanceof CLICallInterface;
        };

        return array_filter($this->calls, $f);
    }

This method really returns CLI\CallInterface array! That’s why I make filtering! I’m sorry, but can’t take this PHPStan seriously.

It’s not part of PHP, it’s part of the PHP IMAP extension, and since you don’t have a composer.json that defines that you need IMAP, PHPStan can’t find it.

It would seem PHPStan doesn’t understand the array_filter here. But just because one is a false positive, doesn’t mean all errors are false positives.

It’s not part of PHP, it’s part of the PHP IMAP extension, and since you don’t have a composer.json that defines that you need IMAP, PHPStan can’t find it.

I think, it’s problem of PHPStan, not my code.

It would seem PHPStan doesn’t understand the array_filter here. But just because one is a false positive, doesn’t mean all errors are false positives.

1-st and 2-nd errors incorrect on same reason.

3-d and 4-th errors incorrect, becose I don’t call this methods without check if ModuleLocator set.

5-th error correct, but not critical. I didn’t seen it becose it is PHPDoc. But it is really syntax error.

6-th and 7-errors incorrect. All values checked in code.

8-th error incorrect. Value checked in code.

9-th and 10-errors correct, but not critical (PHPDoc).

So… Should I really check all 265 errors, if 70% of then - not errors at all, and 30% - unimpotent PHPDoc errors? Hm… Could you offer some another test-tool?

unimportant? If people use your framework in an IDE that uses PHPDoc for type hinting and will fail because the phpdoc is faulty is not important?

We can run PHPStan is less strict mode. The output is then:

 ------ ----------------------------------------------------------------------------------------------------------------------------------- 
  Line   Application/Call/CLI/Call.php                                                                                                      
 ------ ----------------------------------------------------------------------------------------------------------------------------------- 
  41     PHPDoc tag @param has invalid value (string<null $moduleProvider): Unexpected token "$moduleProvider", expected '>' at offset 114  
 ------ ----------------------------------------------------------------------------------------------------------------------------------- 

 ------ -------------------------------------------------------------------------- 
  Line   Autoloader/BaseNamespace.php                                              
 ------ -------------------------------------------------------------------------- 
  100    Comparison operation "==" between Closure|int and 4 results in an error.  
  108    Comparison operation "==" between Closure|int and 0 results in an error.  
 ------ -------------------------------------------------------------------------- 

 ------ ------------------------------------------------------------------------------------------ 
  Line   Calendar/Factory/Factory.php                                                              
 ------ ------------------------------------------------------------------------------------------ 
  110    Cannot call static method createFirstDate() on interface GI\Calendar\Week\WeekInterface.  
 ------ ------------------------------------------------------------------------------------------ 

 ------ ----------------------------------------------------------------------------- 
  Line   Component/Autocomplete/AbstractAutocomplete.php                              
 ------ ----------------------------------------------------------------------------- 
  128    Call to an undefined method GI\ViewModel\AbstractViewModel::validate().      
  129    Call to an undefined method GI\ViewModel\AbstractViewModel::getValidator().  
  132    Call to an undefined method GI\ViewModel\AbstractViewModel::getSearch().     
 ------ ----------------------------------------------------------------------------- 

 ------ ----------------------------------------------------------------------------------------------------------------------------------------- 
  Line   Component/Captcha/ImageText/Gate/Gate.php                                                                                                
 ------ ----------------------------------------------------------------------------------------------------------------------------------------- 
         Class GI\Secure\Captcha\ImageText\Gate\Gate was not found while trying to analyse it - autoloading is probably not configured properly.  
 ------ ----------------------------------------------------------------------------------------------------------------------------------------- 

 ------ -------------------------------------------------------------------------------------------------------------------------------------------------- 
  Line   Component/Captcha/ImageText/Gate/GateInterface.php                                                                                                
 ------ -------------------------------------------------------------------------------------------------------------------------------------------------- 
         Class GI\Secure\Captcha\ImageText\Gate\GateInterface was not found while trying to analyse it - autoloading is probably not configured properly.  
 ------ -------------------------------------------------------------------------------------------------------------------------------------------------- 

 ------ ------------------------------------------------------------------------------------------------------------------- 
  Line   Component/DateTime/Contents/Contents.php                                                                           
 ------ ------------------------------------------------------------------------------------------------------------------- 
  66     PHPDoc tag @param has invalid value ($method): Unexpected token "$method", expected TOKEN_IDENTIFIER at offset 18  
 ------ ------------------------------------------------------------------------------------------------------------------- 

 ------ -------------------------------------- 
  Line   Email/Body/Attachment/Attachment.php  
 ------ -------------------------------------- 
  86     Constant ENCBASE64 not found.         
  86     Constant ENCBINARY not found.         
  105    Constant TYPEIMAGE not found.         
  108    Constant TYPETEXT not found.          
  111    Constant TYPEAUDIO not found.         
  114    Constant TYPEAPPLICATION not found.   
 ------ -------------------------------------- 

 ------ ------------------------------------ 
  Line   Email/Body/Multipart/Multipart.php  
 ------ ------------------------------------ 
  13     Constant TYPEMULTIPART not found.   
 ------ ------------------------------------ 

 ------ ------------------------------ 
  Line   Email/Body/Text/Text.php      
 ------ ------------------------------ 
  132    Constant TYPETEXT not found.  
 ------ ------------------------------ 

 ------ ------------------------------------------------------------------- 
  Line   Email/Email.php                                                    
 ------ ------------------------------------------------------------------- 
  74     Cannot cast GI\Email\Header\Address\AddressesInterface to string.  
 ------ ------------------------------------------------------------------- 

 ------ --------------------------------------------------------------------------------------------------------------------- 
  Line   Filter/Collection/BeanRecursive.php                                                                                  
 ------ --------------------------------------------------------------------------------------------------------------------- 
  16     PHPDoc tag @param has invalid value ($rawData): Unexpected token "$rawData", expected TOKEN_IDENTIFIER at offset 18  
 ------ --------------------------------------------------------------------------------------------------------------------- 

 ------ --------------------------------------------------------------------------------------------------------------------- 
  Line   Filter/Collection/Recursive.php                                                                                      
 ------ --------------------------------------------------------------------------------------------------------------------- 
  90     PHPDoc tag @param has invalid value ($rawData): Unexpected token "$rawData", expected TOKEN_IDENTIFIER at offset 18  
 ------ --------------------------------------------------------------------------------------------------------------------- 

 ------ -------------------------------------------------------- 
  Line   RDB/ORM/ClassManager/Manager.php                        
 ------ -------------------------------------------------------- 
  391    Cannot cast GI\RDB\SQL\Query\QueryInterface to string.  
 ------ -------------------------------------------------------- 

 ------ ----------------------------------- 
  Line   XHTML/DOM/Behaviour/Name/Name.php  
 ------ ----------------------------------- 
  66     Cannot use [] for reading.         
 ------ ----------------------------------- 

 ------ ------------------------------------------------------------------------------------------------------------------------------------------------ 
  Line   XHTML/DOM/Element/Select/Select.php                                                                                                             
 ------ ------------------------------------------------------------------------------------------------------------------------------------------------ 
  27     Return typehint of method GI\XHTML\DOM\Element\Select\Select::getChildren() has invalid type GI\XHTML\DOM\Element\Select\SelectItemSInterface.  
  83     Call to method getOptions() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                               
  99     Call to method getFirst() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                                 
  116    Call to method getOptions() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                               
  151    Call to method clean() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                                    
  157    Call to method createAndAddOption() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                       
  174    Call to method clean() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                                    
  184    Call to method createAndAddOption() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                       
  198    Call to method clean() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                                    
  203    Call to method createAndAddOption() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                       
 ------ ------------------------------------------------------------------------------------------------------------------------------------------------ 

 ------ ---------------------------------------------------------- 
  Line   XHTML/XML/Reader/Reader.php                               
 ------ ---------------------------------------------------------- 
  106    Class DOMXPath referenced with incorrect case: DomXPath.  
  113    Class DOMXPath referenced with incorrect case: DomXPath.  
 ------ ---------------------------------------------------------- 

 ------ ------------------------------------------------------------------------------------------------------------------------------------------- 
  Line   XHTML/XML/Writer/Replicator/Factory/Factory.php                                                                                            
 ------ ------------------------------------------------------------------------------------------------------------------------------------------- 
         Class GI\XHTML\XML\Replicator\Factory\Factory was not found while trying to analyse it - autoloading is probably not configured properly.  
 ------ ------------------------------------------------------------------------------------------------------------------------------------------- 

 ------ ---------------------------------------------------------------------------------------------------------------------------------------------------- 
  Line   XHTML/XML/Writer/Replicator/Factory/FactoryInterface.php                                                                                            
 ------ ---------------------------------------------------------------------------------------------------------------------------------------------------- 
         Class GI\XHTML\XML\Replicator\Factory\FactoryInterface was not found while trying to analyse it - autoloading is probably not configured properly.  
 ------ ---------------------------------------------------------------------------------------------------------------------------------------------------- 

 ------ ------------------------------------------------------------------------------------------------------------------- 
  Line   XHTML/XML/Writer/Writer.php                                                                                        
 ------ ------------------------------------------------------------------------------------------------------------------- 
  291    PHPDoc tag @param has invalid value ($string): Unexpected token "$string", expected TOKEN_IDENTIFIER at offset 18  
 ------ ------------------------------------------------------------------------------------------------------------------- 

unimportant? If people use your framework in an IDE that uses PHPDoc for type hinting and will fail because the phpdoc is faulty is not important?

Said I that all PHPDoc Errors unimportant? I’ve not think so. Exactly this founded error unimportant.

And anyway in “less strict mode” I see also errors that not really errors. So excuse me, but that is not tool I can trust.

Okay, the problem with the TYPEMULTIPART was that I did not have the PHP MIME extension installed locally (never needed it before, plus I didn’t know GI needed it as there is no documentation :wink: )

Here is the output of PHPStan while I have the PHP MIME extension installed (so, no more errors about missing constants):

 ------ ----------------------------------------------------------------------------------------------------------------------------------- 
  Line   Application/Call/CLI/Call.php                                                                                                      
 ------ ----------------------------------------------------------------------------------------------------------------------------------- 
  41     PHPDoc tag @param has invalid value (string<null $moduleProvider): Unexpected token "$moduleProvider", expected '>' at offset 114  
 ------ ----------------------------------------------------------------------------------------------------------------------------------- 

 ------ -------------------------------------------------------------------------- 
  Line   Autoloader/BaseNamespace.php                                              
 ------ -------------------------------------------------------------------------- 
  100    Comparison operation "==" between Closure|int and 4 results in an error.  
  108    Comparison operation "==" between Closure|int and 0 results in an error.  
 ------ -------------------------------------------------------------------------- 

 ------ ------------------------------------------------------------------------------------------ 
  Line   Calendar/Factory/Factory.php                                                              
 ------ ------------------------------------------------------------------------------------------ 
  110    Cannot call static method createFirstDate() on interface GI\Calendar\Week\WeekInterface.  
 ------ ------------------------------------------------------------------------------------------ 

 ------ ----------------------------------------------------------------------------- 
  Line   Component/Autocomplete/AbstractAutocomplete.php                              
 ------ ----------------------------------------------------------------------------- 
  128    Call to an undefined method GI\ViewModel\AbstractViewModel::validate().      
  129    Call to an undefined method GI\ViewModel\AbstractViewModel::getValidator().  
  132    Call to an undefined method GI\ViewModel\AbstractViewModel::getSearch().     
 ------ ----------------------------------------------------------------------------- 

 ------ ----------------------------------------------------------------------------------------------------------------------------------------- 
  Line   Component/Captcha/ImageText/Gate/Gate.php                                                                                                
 ------ ----------------------------------------------------------------------------------------------------------------------------------------- 
         Class GI\Secure\Captcha\ImageText\Gate\Gate was not found while trying to analyse it - autoloading is probably not configured properly.  
 ------ ----------------------------------------------------------------------------------------------------------------------------------------- 

 ------ -------------------------------------------------------------------------------------------------------------------------------------------------- 
  Line   Component/Captcha/ImageText/Gate/GateInterface.php                                                                                                
 ------ -------------------------------------------------------------------------------------------------------------------------------------------------- 
         Class GI\Secure\Captcha\ImageText\Gate\GateInterface was not found while trying to analyse it - autoloading is probably not configured properly.  
 ------ -------------------------------------------------------------------------------------------------------------------------------------------------- 

 ------ ------------------------------------------------------------------------------------------------------------------- 
  Line   Component/DateTime/Contents/Contents.php                                                                           
 ------ ------------------------------------------------------------------------------------------------------------------- 
  66     PHPDoc tag @param has invalid value ($method): Unexpected token "$method", expected TOKEN_IDENTIFIER at offset 18  
 ------ ------------------------------------------------------------------------------------------------------------------- 

 ------ ------------------------------------------------------------------- 
  Line   Email/Email.php                                                    
 ------ ------------------------------------------------------------------- 
  74     Cannot cast GI\Email\Header\Address\AddressesInterface to string.  
 ------ ------------------------------------------------------------------- 

 ------ --------------------------------------------------------------------------------------------------------------------- 
  Line   Filter/Collection/BeanRecursive.php                                                                                  
 ------ --------------------------------------------------------------------------------------------------------------------- 
  16     PHPDoc tag @param has invalid value ($rawData): Unexpected token "$rawData", expected TOKEN_IDENTIFIER at offset 18  
 ------ --------------------------------------------------------------------------------------------------------------------- 

 ------ --------------------------------------------------------------------------------------------------------------------- 
  Line   Filter/Collection/Recursive.php                                                                                      
 ------ --------------------------------------------------------------------------------------------------------------------- 
  90     PHPDoc tag @param has invalid value ($rawData): Unexpected token "$rawData", expected TOKEN_IDENTIFIER at offset 18  
 ------ --------------------------------------------------------------------------------------------------------------------- 

 ------ -------------------------------------------------------- 
  Line   RDB/ORM/ClassManager/Manager.php                        
 ------ -------------------------------------------------------- 
  391    Cannot cast GI\RDB\SQL\Query\QueryInterface to string.  
 ------ -------------------------------------------------------- 

 ------ ----------------------------------- 
  Line   XHTML/DOM/Behaviour/Name/Name.php  
 ------ ----------------------------------- 
  66     Cannot use [] for reading.         
 ------ ----------------------------------- 

 ------ ------------------------------------------------------------------------------------------------------------------------------------------------ 
  Line   XHTML/DOM/Element/Select/Select.php                                                                                                             
 ------ ------------------------------------------------------------------------------------------------------------------------------------------------ 
  27     Return typehint of method GI\XHTML\DOM\Element\Select\Select::getChildren() has invalid type GI\XHTML\DOM\Element\Select\SelectItemSInterface.  
  83     Call to method getOptions() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                               
  99     Call to method getFirst() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                                 
  116    Call to method getOptions() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                               
  151    Call to method clean() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                                    
  157    Call to method createAndAddOption() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                       
  174    Call to method clean() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                                    
  184    Call to method createAndAddOption() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                       
  198    Call to method clean() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                                    
  203    Call to method createAndAddOption() on an unknown class GI\XHTML\DOM\Element\Select\SelectItemSInterface.                                       
 ------ ------------------------------------------------------------------------------------------------------------------------------------------------ 

 ------ ---------------------------------------------------------- 
  Line   XHTML/XML/Reader/Reader.php                               
 ------ ---------------------------------------------------------- 
  106    Class DOMXPath referenced with incorrect case: DomXPath.  
  113    Class DOMXPath referenced with incorrect case: DomXPath.  
 ------ ---------------------------------------------------------- 

 ------ ------------------------------------------------------------------------------------------------------------------------------------------- 
  Line   XHTML/XML/Writer/Replicator/Factory/Factory.php                                                                                            
 ------ ------------------------------------------------------------------------------------------------------------------------------------------- 
         Class GI\XHTML\XML\Replicator\Factory\Factory was not found while trying to analyse it - autoloading is probably not configured properly.  
 ------ ------------------------------------------------------------------------------------------------------------------------------------------- 

 ------ ---------------------------------------------------------------------------------------------------------------------------------------------------- 
  Line   XHTML/XML/Writer/Replicator/Factory/FactoryInterface.php                                                                                            
 ------ ---------------------------------------------------------------------------------------------------------------------------------------------------- 
         Class GI\XHTML\XML\Replicator\Factory\FactoryInterface was not found while trying to analyse it - autoloading is probably not configured properly.  
 ------ ---------------------------------------------------------------------------------------------------------------------------------------------------- 

 ------ ------------------------------------------------------------------------------------------------------------------- 
  Line   XHTML/XML/Writer/Writer.php                                                                                        
 ------ ------------------------------------------------------------------------------------------------------------------- 
  291    PHPDoc tag @param has invalid value ($string): Unexpected token "$string", expected TOKEN_IDENTIFIER at offset 18  
 ------ -------------------------------------------------------------------------------------------------------------------

Okey, let’s try again