Unable to load vendor classes from other namespace

微笑、不失礼 提交于 2019-12-24 11:29:41

问题


I'm having some hard time wrapping around namespaces in PHP, especially when you code needs to interact with scripts residing in another namespace. I downloaded a Shopify API toolkit and trying to get it working. Everything was fine before I started adding namespaces to my code (which is required or threre is script collisition with other Wordpress plugins on my site). Also, the weird namespace {} bit at the top is because in this same file I want a globally accessible function for making the class a singleton.

Looking forward to learning more about how this works.

#### FILE BEING CALLED

namespace {

    function SomeFunctionToBeAccessedGlobally() {
        return 'Hello';
    }
}

namespace MySpecialApp {

    class ShopifyImport {

        public function __construct() {
            // Do Whatever
            $this->doImport();
        }

        public function doImport() {

            require __DIR__ . '/vendor/autoload.php';

            $credential     = new Shopify\PrivateAppCredential('standard_api_key', 'secret_api_key', 'shared_api_key');
            $client         = new Shopify\Client($credential, 'shop_url', [ 'metaCacheDir' => './tmp' ]);

        }

    }

}


#### FILE '/vendor/autoload.php'

require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit73503f8de5d68cdd40a9c0dfd8a25b44::getLoader();

I do noice that some of the files which where part of the repository cloned into vendor have namespace Slince\Shopify; declarations. I tried to do a use with that namespace within my original namespace but it also didn't work.

The PHP Error being reported is:

Fatal error: Uncaught Error: Class 'MySpecialApp\Shopify\PrivateAppCredential' not found in /.../ShopifyImporter.php:139 Stack trace: #0 (Blah Blah Blah)


回答1:


Your code tries to create a new Shopify\PrivateAppCredential() object in the current namespace. However, this class does not exist in your namespace since it is part of the "vendor" namespace.

You can "reset" (read fallback) to the global namespace for your object creations by adding a \ in front of them, as described in the documentation:

$credential = new \Shopify\PrivateAppCredential('standard_api_key', 'secret_api_key', 'shared_api_key');

You can check the difference here without \ and with \.



来源:https://stackoverflow.com/questions/57136737/unable-to-load-vendor-classes-from-other-namespace

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!