Composer Gives Error, "Class Not Found"
Asked Answered
I

1

8

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

Insult answered 22/10, 2015 at 19:29 Comment(4)
Maybe it's because you are missing namespace myns; in your child class?Symphysis
What @BrianGlaz said, also: You shouldn't need the require_once in your child class at all - that's what the autoloader is for.Laager
@BrianGlaz Yes, that's correct. It resolved my problem. Thanks for quick response :-)Insult
@ccKep That's great. I really didn't know that.Insult
H
8

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.

Houseline answered 22/10, 2015 at 19:46 Comment(1)
great answer! Would you be able to help me on my question: #39534295Bissonnette

© 2022 - 2024 — McMap. All rights reserved.