【问题标题】:PHP - PSR-4 autoload in WordPress Plugin namespacePHP - WordPress 插件命名空间中的 PSR-4 自动加载
【发布时间】:2019-03-09 01:34:43
【问题描述】:

我知道有人问过很多类似的问题,但我已按照我能找到的所有指南进行操作,但它仍然不适合我。我不知道这是否与它是一个 WordPress 插件有关,但自动加载器没有找到我的类。

在我的插件中,我遇到了很多类名冲突。我知道我可以在每个类前面加上插件的名称,但我觉得将整个项目放在特定的命名空间下会更容易/更干净。我对 PHP 还有些陌生,所以我可能认为这一切都是错误的,但我认为它应该可以工作。我知道还有其他方法可以完成这项工作,但我想了解为什么这不起作用。感谢您提供任何意见或帮助!

我得到的错误:

Fatal error: Class 'DistinguishedSites\Inc\Base\Activate' not found in /home/pluginte/public_html/wp-content/plugins/distinguished-sites/distinguished-sites-plugin.php on line 47

简化目录结构:

/distinguished-sites
  - distinguished-sites-plugin.php
  - composer.json
  - /vendor
      - *All vendor files*
  - /inc
      - /Base
          - Activate.php
  *etc...*

激活.php 文件:

<?php
/**
 * @package DistinguishedSites
 */
namespace DistinguishedSites\Inc\Base;

class Activate
{

    public static function activate() {
        $db = new DatabaseApi();
        $filter = new PostFilter;

        $db->createTable(); 

        $results = $filter->filterPosts();

        flush_rewrite_rules();
    }
}

我正在尝试在我的 distinct-sites-plugin.php 文件中使用 Activate 类:

<?php
/**
 * @package DistinguishedSites
 */

use \DistinguishedSites\Inc\Base\Activate;

defined( 'ABSPATH' ) or die( 'Hey, what are you doing here? You silly human!' );

// Require autoload file.
if ( file_exists( dirname( __FILE__ ) . '/vendor/autoload.php' ) ) {
    require_once dirname( __FILE__ ) . '/vendor/autoload.php';
}

define( 'PLUGIN_PATH', plugin_dir_path( __FILE__ ));
define( 'PLUGIN_URL', plugin_dir_url( __FILE__ ));
define( 'PLUGIN', plugin_basename( __FILE__ ));

// Runs on plugin activation.
function activate_distinguished_sites_plugin() {
    Activate::activate();
}
register_activation_hook( __FILE__, 'activate_distinguished_sites_plugin');

// Runs of plugin deactivation.
function deactivate_distinguished_sites_plugin() {
    //Deactivate::deactivate();
}
register_deactivation_hook( __FILE__, 'deactivate_distinguished_sites_plugin');


// Initialize core classes of the plugin. 
if ( class_exists( 'DistinguishedSites\Init' ) ) {
    Init::register_services();
}

composer.json 文件:

{
    "name": "sno/distinguished-sites",
    "description": "Distinguished sites badge submission plugin.",
    "type": "project",
    "license": "GPL",
    "authors": [
        {
            "name": "noah",
            "email": "noah.seichter@snosites.com"
        }
    ],
    "minimum-stability": "dev",
    "require": {},
    "autoload": {
        "psr-4": {
            "DistinguishedSites\\": "."
        }
    }
}

autoload_psr4.php 文件:

<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'DistinguishedSites\\' => array($baseDir . '/'),
);

【问题讨论】:

    标签: php wordpress plugins namespaces autoload


    【解决方案1】:

    PSR-4 自动加载器区分大小写,因此您应该将 Inc/ 目录大写,或者在命名空间中使用小写。

    子目录名称必须与子命名空间名称的大小写匹配。

    https://www.php-fig.org/psr/psr-4/

    【讨论】:

    • 哇...我用作参考的项目在 psr-4 文件中有 'Inc\\' => array($baseDir . '/inc')。我没有意识到这是弥补案例差异。非常感谢!
    • 感谢您的回答,我一直在拼命想弄清楚为什么我的插件在本地工作而不是在实时服务器上工作。仅供看到此的任何人使用。如果您承诺使用 git,它将小写您的文件夹名称。您需要通过在终端中运行 git config core.ignorecase false 来告诉 git 它不应忽略文件夹名称的大小写。
    猜你喜欢
    • 2015-08-23
    • 2015-07-03
    • 2015-12-01
    • 2016-05-18
    • 2014-09-24
    • 2016-01-22
    • 1970-01-01
    • 2012-09-05
    • 2016-05-30
    相关资源
    最近更新 更多