【问题标题】:PHP Namespace Undefined FunctionPHP 命名空间未定义函数
【发布时间】:2016-03-29 07:42:19
【问题描述】:

我正在创建一个基于 Sage WordPress 入门主题的主题,并创建了一个新的命名空间来存储我的一些函数 (Roots\Sage\Color_Scheme)。

当我尝试从该命名空间调用函数时,我收到错误消息

调用未定义的函数 Roots\Sage\Color_Scheme\custom_header_and_background() 在 C:\xampp\htdocs\wordpress\wp-content\themes\soaring\lib\setup.php on 第 19 行

由于我声明了“使用 Roots\Sage\Color_Scheme”并且该函数肯定在 color_scheme.php 文件中,我不确定为什么它实际上没有识别该函数。请注意,color_scheme.php 是一个命名空间的函数集合,但不包含已声明的类。

安装程序.php

namespace Roots\Sage\Setup;

use Roots\Sage\Assets;
use Roots\Sage\Color_Scheme;

/**
 * Theme setup
 */
function setup() {
  // Enable features from Soil when plugin is activated
  // https://roots.io/plugins/soil/
  add_theme_support('soil-clean-up');
  add_theme_support('soil-nav-walker');
  add_theme_support('soil-nice-search');
  add_theme_support('soil-jquery-cdn');
  add_theme_support('soil-relative-urls');
  Color_Scheme\custom_header_and_background();
  ...

这里是 Color_Scheme.php 的相关部分(位于同一目录中)

<?php
namespace Roots\Sage\Color_Scheme;

/**
 * Adds theme support for custom background and custom header
 * 
 * Include default values for several settings.
 */
function custom_header_and_background() {
    $color_scheme             = get_color_scheme();
    $default_background_color = trim( $color_scheme[0], '#' );
    $default_text_color       = trim( $color_scheme[1], '#' );

/**
 * Filter the arguments used when adding 'custom-background' support in Soaring.
 *
 * @since Soaring 1.0
 *
 * @param array $args {
 *     An array of custom-background support arguments.
 *
 *     @type string $default-color Default color of the background.
 * }
 */
add_theme_support( 'custom-background', apply_filters( 'soaring_custom_background_args', array(
        'default-color' => $default_background_color,
)));

// HEADER
$custom_header_args = array(
        'width'         => 300,
        'height'        => 120,
        'flex-width'    => true,
        'flex-height'   => true,
        'default-image' => get_template_directory_uri() . '/images/soaring-logo.png',
);
add_theme_support( 'custom-header', $custom_header_args );
}

【问题讨论】:

  • 您的 Setup.php 是否包含 include 到 Color_Scheme.php?
  • 不,它没有。 color_scheme.php 在目录中,但我从未写过一行来包含它。即使命名空间和同一目录也有必要吗?
  • 如果我执行“include 'color_scheme.php'”,它似乎确实可以工作并识别该功能。如果我想从另一个文件访问函数,这就是我需要做的吗?
  • 如果您不想在 Setup.php 文件中使用 require_once。您还可以使用位于 functions.php 中的 Sage 的 $sage_includes = [ ] 数组包含您的 color_scheme.php 文件。

标签: php wordpress namespaces runtime-error


【解决方案1】:

未定义函数的名称是:

  • Roots\Sage\Color_Scheme\custom_header_and_background()

定义的函数的名称是:

  • Roots\Sage\Color_Scheme\custom_header_and_background()

正如它所显示的,名称本身不是问题,只是缺少定义。这正是您的评论:

color_scheme.php 在目录中,但我从未写过一行来包含它。即使命名空间和同一目录也有必要吗?

是的。 PHP 不会自行加载文件。你需要这样做。

PHP 仅具有自动加载类的机制,但即便如此,您也需要为其注册一个自动加载器。

对于尚不存在自动加载的函数(有一些关于它的讨论,例如PHP RFC Function Autoloading),因此您需要在使用前包含函数定义。 require_once 指令和 __DIR__ 常量可能会对您的情况有所帮助:

...
require_once __DIR__ . '/color_scheme.php';
Color_Scheme\custom_header_and_background();
...

这应该可以让你让它工作。然后我强烈建议将 require 行移到文件的顶部,以减少它的条件,您可以更好地查看文件具有哪些依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    相关资源
    最近更新 更多