Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP名称空间5.3和WordPress小部件_Php_Wordpress_Namespaces - Fatal编程技术网

PHP名称空间5.3和WordPress小部件

PHP名称空间5.3和WordPress小部件,php,wordpress,namespaces,Php,Wordpress,Namespaces,我正在使用名称空间 我尝试创建一个WordPress小部件(http://codex.wordpress.org/Widgets_API) 对于名称空间,下面给出了一个错误,因为无法传递参数(没有名称空间,它显然像往常一样工作) 嗯。。。使用名称空间的“parent::WP_小部件”的正确语法是什么 (完整的错误消息是: ) 调试器显示未传递任何内容: (只需要$name)要调用父方法吗?只需使用parent::MethodName() 如果您想调用父构造函数,请使用parent::\uu co

我正在使用名称空间

我尝试创建一个WordPress小部件(http://codex.wordpress.org/Widgets_API)

对于名称空间,下面给出了一个错误,因为无法传递参数(没有名称空间,它显然像往常一样工作)

嗯。。。使用名称空间的“parent::WP_小部件”的正确语法是什么

(完整的错误消息是:

)

调试器显示未传递任何内容:


(只需要$name)

要调用父方法吗?只需使用
parent::MethodName()


如果您想调用父构造函数,请使用
parent::\uu construct()
-如果您的构造函数的名称与类类似,请将其重命名为
\uu construct
,这是多年来构造函数的首选名称…

在我看来,您的问题似乎不在名称空间中,以下代码非常有用:

<?php
namespace Foo;

class Bar {
    function __construct( $foo ) {
        echo "$foo\n";
    }
}

namespace Foo\Bar;

class Foo extends \Foo\Bar {
    function __construct( ) {
        parent::__construct( "This should work." );
    }
}

$foo = new \Foo\Bar\Foo( );

查看文档,似乎只需要名称,但PHP的工作方式也必须定义预定义变量

创建类有两种方法:

  • A:
    • WP\u Widget\u构造([string$id\u base=false]、string$name、[array$Widget\u options=array()]、[array$control\u options=array())
  • B:
    • WP\u Widget WP\u Widget([$id\u base=false],$name,[$Widget\u options=array()],[$control\u options=array()])
您最好始终使用
\uu construct
方法初始化对象,我会像这样重写您的代码:

namespace a\b\c;

class whatever extends \WP_Widget
{
    function __construct()
    {
        parent::__construct('name1', 'name2');
    }

    /*
         * Other methods!
    */
}
WP_Widget::WP_Widget(..)
方法仅适用于PHP4,不应在PHP5或更高版本中使用

现在,您似乎正在使用PHP 5.3作为名称空间,以便可以执行以下操作:

add_action('widgets_init', function() {
    return register_widget(new a\b\c\whatever);
});

我不使用Wordpress,但从这个角度来看,这似乎是由于Wordpress的设计非常糟糕。它们似乎使用静态函数WP_Widget,该Widget用作工厂,但与类名共享相同的名称。如果它真的只是一个工厂,他们应该称之为工厂

另外,根据您在评论中发布的内容,您可能需要在子类中创建一个静态函数WP_Widget(),然后甚至不调用父类。如果脚本真的希望您覆盖WP_小部件,那么这就是您应该做的

但是,我从来没有使用过Wordpress,不看脚本很难判断


您应该在此处发布准确的错误代码。

这对我来说很好:

add_action('widgets_init', function() {                 
    register_widget('\a\b\c\whatever');
});

您还可以使用PHP的原生
get_class
方法,该方法将以字符串形式返回任何类实例化的名称


register\u小部件(获取类(new\UCI\Wordpress\widget\Footer())

在此处发布准确的错误消息。从代码上看,似乎没有任何错误。还有,为什么要使用parent而不仅仅是$this->WP\u小部件?最后,WP_Widget是WP_Widget类的构造函数吗?为什么函数与类具有相同的名称?如果它是一个构造函数,那么最好使用_construct()。。。它应该被覆盖,而不是被_构造覆盖,请参阅源代码(情不自禁它没有编写)@dmitri:parent::WP_Widget和$this->WP_Widget都会传递相同的错误,这两个变体都在web上使用。WP_Widget是根据法典应该被覆盖的函数。谢谢,我肯定错过了什么,我已经在使用parent::WP_Widget(),但我可能忽略了什么?@berry langerak:很高兴知道这不是我的语法。然后。。。它是什么?父类是默认的:core.svn.wordpress.org/trunk/wp-includes/widgetsIt wordpress为旧的PHP4类型构造函数(yugh)提供了一个代理方法。您可能需要考虑使用父::另外,在调用_construct()时,请确保使用至少两个参数来调用它。如果注释导致错误得到解决,那么在答案不是问题的直接答案时,为什么要将其标记为正确答案,请更新您的帖子。@RobertPitt答案中的代码是正确的代码:我需要函数_构造,然后在那里需要父::_构造,与这里的文档代码相反:我已经发布了完整准确的错误代码,我可以添加堆栈跟踪?函数u构造成功了,谢谢,答案比berry晚了一分钟,因此我将berry标记为答案。regiser_小部件添加不适用于其中的\a\b\c,\n因为它位于命名空间范围内。如果我删除名称空间部分,它会给出“警告:第324行C:\xampp\htdocs\wp2\wp includes\widgets.php中的非法偏移量类型”,因此。。。我现在使用问题中的代码,稍后将检查如何执行此操作。谢谢。只需将
a\b\c\whatever
封装在一个字符串中并删除新的关键字,这可能取决于Wordpress使用值的方式。是的,它起作用:add_action('widgets_init',function(){return register_widget('a\b\c\whatever');});感谢为$id_base传递false有问题(从WordPress 3.3.1开始)。在wp admin/includes/widgets.php中,$id_base用作正则表达式的一部分(第118行),命名空间中的反斜杠将导致问题。我建议将示例更改为始终明确给出$id_base,并注意它不应包含正则表达式元字符。特别是,它不应该包含点,虽然点作为重元字符可能不会导致问题,但在form processing.register_小部件的类名和实例中转换为下划线时会导致问题。如果需要使用类名,请改用
\a\b\c\whatever::class
namespace a\b\c;

class whatever extends \WP_Widget
{
    function __construct()
    {
        parent::__construct('name1', 'name2');
    }

    /*
         * Other methods!
    */
}
add_action('widgets_init', function() {
    return register_widget(new a\b\c\whatever);
});
add_action('widgets_init', function() {                 
    register_widget('\a\b\c\whatever');
});