简体   繁体   中英

Composer Gives Error, “Class Not Found”

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": "XXXXX@gmail.com"
        }
    ],
    "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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM