PHP 命名空间未定义函数
PHP Namespace Undefined Function
我正在创建一个基于 Sage WordPress 入门主题的主题,并创建了一个新的命名空间来存储我的一些功能 (Roots\Sage\Color_Scheme)。
当我尝试从该命名空间调用函数时,收到错误消息
Call to undefined function
Roots\Sage\Color_Scheme\custom_header_and_background() in
C:\xampp\htdocs\wordpress\wp-content\themes\soaring\lib\setup.php on
line 19
因为我声明了 "use Roots\Sage\Color_Scheme" 并且该函数肯定在 color_scheme.php 文件中,所以我不确定为什么它实际上没有识别该函数。请注意,color_scheme.php 是一个命名空间的函数集合,但不包含已声明的 class.
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 is in the directory but I never wrote a line to include it. Is that necessary even with namespace and the same directory?
是的。 PHP 不会自行加载文件。你需要这样做。
PHP只有自动加载的机制类,但即便如此,你也需要为它注册一个自动加载器。
对于尚不存在自动加载的函数(有一些关于它的讨论,例如 PHP RFC Function Autoloading),因此您需要在使用前包含函数定义。 require_once
指令和 __DIR__
常量可能会对您的情况有所帮助:
...
require_once __DIR__ . '/color_scheme.php';
Color_Scheme\custom_header_and_background();
...
这应该能让您正常工作。然后我强烈建议将 require 行移到文件的顶部以减少它的条件,你可以更好地查看文件具有哪些依赖项。
我正在创建一个基于 Sage WordPress 入门主题的主题,并创建了一个新的命名空间来存储我的一些功能 (Roots\Sage\Color_Scheme)。
当我尝试从该命名空间调用函数时,收到错误消息
Call to undefined function Roots\Sage\Color_Scheme\custom_header_and_background() in C:\xampp\htdocs\wordpress\wp-content\themes\soaring\lib\setup.php on line 19
因为我声明了 "use Roots\Sage\Color_Scheme" 并且该函数肯定在 color_scheme.php 文件中,所以我不确定为什么它实际上没有识别该函数。请注意,color_scheme.php 是一个命名空间的函数集合,但不包含已声明的 class.
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 is in the directory but I never wrote a line to include it. Is that necessary even with namespace and the same directory?
是的。 PHP 不会自行加载文件。你需要这样做。
PHP只有自动加载的机制类,但即便如此,你也需要为它注册一个自动加载器。
对于尚不存在自动加载的函数(有一些关于它的讨论,例如 PHP RFC Function Autoloading),因此您需要在使用前包含函数定义。 require_once
指令和 __DIR__
常量可能会对您的情况有所帮助:
...
require_once __DIR__ . '/color_scheme.php';
Color_Scheme\custom_header_and_background();
...
这应该能让您正常工作。然后我强烈建议将 require 行移到文件的顶部以减少它的条件,你可以更好地查看文件具有哪些依赖项。