Composer Gives Error, "Class Not Found"

12,389

In composer.json you defined that for src folder you use myns namespace, so in your childclass.php you should use

namespace myns;

It's also unnecessary to add:

require_once 'parentclass.php';

or

use myns\parentclass as parentclass;

so your childclass.php should look like this:

<?php

namespace myns;

class childclass extends parentclass
{
    public function abc()
    {
        echo 'hello world';
    }
}

In addition in run.php file you might replace:

use myns\childclass as childclass;

into

use myns\childclass;

You don't need to use as if you don't want to use other name for class.

You should also consider using namespaces with capital letter (Studly caps) and the same for classes. Instead of myns use MyNs, instead of parentclass use ParentClass. You should look at PSR-1 coding standard and PSR-2 coding standard to follow best coding practises.

Share:
12,389
Omar Tariq
Author by

Omar Tariq

AWS | Symfony | React

Updated on June 08, 2022

Comments

  • Omar Tariq
    Omar Tariq almost 2 years

    I'm using Windows 10. After making a folder src in the root directory I created two files in it.

    Directory Structure (Before running composer install):

    │
    ├── composer.json
    ├── run.php
    │
    └── src
         ├── childclass.php
         └── parentclass.php
    

    Two files in the root directory:

    composer.json:

    {
        "name": "myvendor/mypackage",
        "description": "nothing",
        "authors": [
            {
                "name": "Omar Tariq",
                "email": "[email protected]"
            }
        ],
        "require": {},
        "autoload": {
            "psr-4": {
                "myns\\": "src/"
            }
        }
    }
    

    run.php:

    <?php
    
    require_once __DIR__ . '/vendor/autoload.php';
    
    use myns\childclass as childclass;
    
    $childclass = new childclass();
    $childclass->abc();
    

    Two files in the src folder:

    childclass.php:

    <?php
    
    require_once 'parentclass.php';
    
    use myns\parentclass as parentclass;
    
    class childclass extends parentclass
    {
        public function abc()
        {
            echo 'hello world';
        }
    }
    

    parentclass.php:

    <?php
    
    namespace myns;
    
    abstract class parentclass
    {
        abstract public function abc();
    }
    

    Directory structure after running composer install:

    │
    ├── composer.json
    ├── run.php
    │
    ├── src
    │    ├── childclass.php
    │    └── parentclass.php
    │
    └── vendor
         ├── autoload.php
         │
         └── composer
              ├── autoload_classmap.php
              ├── autoload_namespaces.php
              ├── autoload_psr4.php
              ├── autoload_real.php
              ├── ClassLoader.php
              ├── installed.json
              └── LICENSE
    

    Now, when I run:

    php run.php
    

    I get this error:

    Fatal error: Class 'myns\childclass' not found in C:\wamp...\run.php on line 7

    • Brian Glaz
      Brian Glaz over 8 years
      Maybe it's because you are missing namespace myns; in your child class?
    • ccKep
      ccKep over 8 years
      What @BrianGlaz said, also: You shouldn't need the require_once in your child class at all - that's what the autoloader is for.
    • Omar Tariq
      Omar Tariq over 8 years
      @BrianGlaz Yes, that's correct. It resolved my problem. Thanks for quick response :-)
    • Omar Tariq
      Omar Tariq over 8 years
      @ccKep That's great. I really didn't know that.
  • LatentDenis
    LatentDenis over 7 years
    great answer! Would you be able to help me on my question: stackoverflow.com/questions/39533795/…