PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Monday, January 31, 2022

[FIXED] Include and namespace in php

 January 31, 2022     composer-php, laravel, laravel-4, php     No comments   

Issue

I have created this factory class:

namespace ValidatorFactory;

foreach (glob("Types/*.php") as $filename)
{
    include $filename;
}

class ValidatorFactory
{
    public static function getValidator($betTypeId)
    {
        switch ($betTypeId)
        {
            case 1:
                return new B();
                break;

            default:
                return null;
        }
    }
}

Here is my A abstract class definition:

abstract class A
{
    abstract function validateSchema($schema);
}

Here is my B class definition:

class B extends A
{
    function validateSchema($schema)
    {
        return true;
    }
}

Now I want to use the factory class in some other file in my project, here is how I am doing it:

$obj = ValidatorFactory::getValidator($someId);

I am using Laravel and via composer (and this tutorial) I tried to load the ValidatorFactory class like built in classes of laravel. Here is what I have added to the composer file:

"autoload": {
    "classmap": [
        ...
    ],
    "psr-0": {
        "ValidatorFactory": "app/"
    }
},

I have run composer update.

My problem is that my ValidatorFactory is not loaded because I am getting this error:

Class 'ValidatorFactory' not found

If I will add the namespace like this:

$obj = ValidatorFactory\ValidatorFactory::getValidator($someId);

I am getting other error, here it is:

Class 'ValidatorFactory\B' not found

So there are 2 problems, first related to larave/composer autoload (of the namespace). The second is related to includes and inheritance (as I suspect) in php.

How can I solve this two issues? Thanks!

Update: As suggested in the answer, I have added the same namespace for all 3 involved classes A, B and the factory. No class including any other class.

In the class which calls the factory's getValidator function I am doing it like this:

$obj = ValidatorFactory\ValidatorFactory::getValidator($someId);

Still getting the error which says class B is unknown :(

Here is how the updated class B looks like:

namespace ValidatorFactory;
class B extends A
{
    function validateSchema($schema)
    {
        return true;
    }
}

The file structure looks like this: factory file located in app/dir1/ , Class A and B located in app/dir1/dir2/


Solution

From our chat discussion, we couldn't figure out why PSR-0 is not working for you. It turns out that PSR-4 configuration works fine. So I summarise here what we did in the discussion to use PSR-4 autoloading.

File structure:

app
 |- commands
 |- config
 |- ...
 |- MyValidator
    |- MyValidatorFactory.php
    |- A.php
    |- B.php
 |- ...

MyValidatorFactory.php

namespace MyValidator;

class MyValidatorFactory
{
    ...
    return new B();
    ...
}

B.php

namespace MyValidator;

class B extends A
{
    function validateSchema($schema)
    {
        return true;
    }
}

And finally you can setup PSR-4 autoloading in your composer.json:

"autoload": {
    ...
    "psr-4": {
        "MyValidator\\": "app/MyValidator"
    }
}

Bonus point:

With the psr-4 configuration above, you may also structure your namespaces and classes like this:

app
 |- commands
 |- config
 |- ...
 |- MyApp
    |- Validators
        |- MyValidatorFactory.php
        |- A.php
        |- B.php
 |- ...

And set the psr-4 config to "MyApp\\": "app/MyApp", the autoloader will recognise your classes and use it like below:

new \MyApp\Validators\MyValidatorFactory;
new \MyApp\Validators\A;
new \MyApp\Validators\B;


Answered By - Unnawut
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing