PHP命名空间未定义函数


PHP Namespace Undefined Function

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

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

对未定义函数的调用中的Roots''Sage''Color_Scheme''custom_header_and_background()C: 上的''xamplep''htdocs''wordpress''wp-content''themes''s飙升''lib''setup.php19号线

由于我已经声明了"use Roots''Sage''Color_Scheme",并且该函数肯定在Color_Scheme.php文件中,所以我不确定它为什么没有真正识别该函数。请注意,color_scheme.php是一个带有名称空间的函数集合,但不包含任何已声明的类。

Setup.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 );
}

未定义函数的名称为:

  • Roots'Sage'Color_Scheme'custom_header_and_background()

定义函数的名称为:

  • Roots'Sage'Color_Scheme'custom_header_and_background()

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

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

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

PHP只有一个自动加载类的机制,但即使这样,你也需要为它注册一个自动加载器

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

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

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