簡體   English   中英

作曲家-自動加載后找不到類

[英]Composer - class not found after autoloading

我的課程結構如下:

myproject
    |
    -------src (namespace PicoCore;)
            |
            -----objects (namespace PicoCore\Objects;)
            -----tests (namespace PicoCore\Tests;)

我已經從自動加載創建了composer.json:

{
    "autoload": {
        "psr-0": {
            "PicoCore": "src",
            "PicoCore\\Objects" : "src/objects",
            "PicoCore\\Tests" : "src/tests"
        }
    }
}

安裝后,我已經創建了一個測試腳本:

<?php

require_once "../../vendor/autoload.php";

use PicoCore\Objects\User;

$user = new User();
$user->name = "asaf";
echo $user->name;

?>

用戶類別:

<?php
/**
 * Created by PhpStorm.
 * User: avivpaz
 * Date: 12/25/14
 * Time: 12:07 PM
 */

namespace PicoCore\Objects;

class User extends APIUser implements ConvertibleObjects
{


    /**
     * @var string User's Name
     */
    public $name;



    /**
     * @var string User's Push Id
     */
    public $pushId;


    /**
     * @var UserDevice User's device type
     */
    public $userDevice;

    /**
     * @var double The location latitude
     */
    public $latitude;

    /**
     * @var double The location longitude
     */
    public $longitude;

    public function __construct()
    {
        $this->label = USER_LABEL;
    }

    /**
     * init with APIUser
     * @param $APIUser APIUser
     * @return User type
     */
    public static function withAPIUser($APIUser)
    {
        $user = new User();
        $user->label=USER_LABEL;
        $user->id = $APIUser->id;
        $user->facebookAccessToken = $APIUser->facebookAccessToken;
        $user->picoAccessToken = $APIUser->picoAccessToken;
        $user->accessTokenExpires = $APIUser->accessTokenExpires;
        return $user;

    }

    public function ConvertObjectToCypherSyntax()
    {
        return '{id:"' . $this->id . '",name:"' . $this->name . '",picoAccessToken:"' . $this->picoAccessToken . '",accessTokenExpires:"' . $this->accessTokenExpires->getTimestamp() . '",latitude:' . $this->latitude . ',longitude:' . $this->longitude . '}';

    }

    static public function  ConvertNodeToObject($results)
    {
        $user = new User();
        if (is_null($results))
            return $user;
        $user->id = $results->getProperty('id');
        $user->name = $results->getProperty('name');
        $user->picoAccessToken = $results->getProperty('picoAccessToken');
        $user->latitude = $results->getProperty('latitude');
        $user->longitude = $results->getProperty('longitude');
        //    $user->userDevice = UserDevice::ConvertNodeToObject($results['userDevice']);
        if (!$results->getProperty('accessTokenExpires') == "")
            $user->accessTokenExpires = getDateTimeFromTimeStamp($results->getProperty('accessTokenExpires'));
        return $user;
    }

    static public function ConvertArrayToObject($array) {
      $user = new User();

      if (array_key_exists("id", $array))
        $user->id = $array["id"];
      if (array_key_exists("name", $array))
        $user->name = $array["name"];
      if (array_key_exists("pico_access_token", $array))
        $user->picoAcceessToken = $array["pico_access_token"];
      if (array_key_exists("access_token_expires", $array))
        $user->accessTokenExpires = getDateTimeFromString($array["access_token_expires"]);
      if (array_key_exists("device_type", $array))
        $user->deviceType = $array["device_type"];
      if (array_key_exists("latitude", $array))
        $user->latitude = $array["latitude"];
      if (array_key_exists("longitude", $array))
        $user->longitude = $array["longitude"];
      if (array_key_exists("userDevice", $array))
        $user->userDevice = UserDevice::ConvertArrayToObject($array["userDevice"]);

      return $user;
    }

    public function toArray()
    {
        $user = array();

        if (!empty($this->id))
            $user["id"] = $this->id;
        if (!empty($this->name))
            $user["name"] = urldecode($this->name);
        if (!empty($this->picoAccessToken))
            $user["pico_access_token"] = $this->picoAccessToken;
        if (!empty($this->accessTokenExpires))
            $user["access_token_expires"] = getMysqlDateTime($this->accessTokenExpires);
        if (!empty($this->latitude))
            $user["latitude"] = $this->latitude;
        if (!empty($this->longitude))
            $user["longitude"] = $this->longitude;
        if (isset($this->userDevice)) {
            $userDevice = $this->userDevice->toArray();
            if (!empty($userDevice))
                $user["userDevice"] = $userDevice;
        }
        if (count($user) > 0)
            return $user;
        return null;
    }
}

我收到一個找不到類異常的提示。

如果它是沒有類的命名空間,則必須以\\\\結尾:

"autoload": {
    "psr-0": {
        "PicoCore\\": "src",
        "PicoCore\\Objects\\" : "src/objects",
        "PicoCore\\Tests\\" : "src/tests"
    }
}

並檢查文件自動加載

composer / autoload_namespaces.php

參見https://getcomposer.org/doc/04-schema.md#psr-0

使用PSR-0

為了使用PSR-0,您需要將結構布局更改為:

src/
└── PicoCore
    ├── Objects
    │   └── User.php
    └── Tests

在您的composer.json文件中,您需要添加PicoCore命名空間:

"psr-0": {
    "PicoCore\\": "src"
}

PSR-4的替代品

如果要保留當前的文件系統布局,可以使用PSR-4而不是PSR-0。 為了使用PSR-4,您需要更新composer.json:

"autoload": {
    "psr-4": {
        "PicoCore\\": "src",
        "PicoCore\\Objects\\" : "src/objects",
        "PicoCore\\Tests\\" : "src/tests"
    }
}

進行更改后,運行composer dumpautoload來重新生成自動加載文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM