Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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 功能合作伙伴($atts){ 提取(短码)附件(数组( 'ids'=>null, 'extra_options'=>'something'_Php_Wordpress_Function_Variables - Fatal编程技术网

嵌套函数、变量-PHP 功能合作伙伴($atts){ 提取(短码)附件(数组( 'ids'=>null, 'extra_options'=>'something'

嵌套函数、变量-PHP 功能合作伙伴($atts){ 提取(短码)附件(数组( 'ids'=>null, 'extra_options'=>'something',php,wordpress,function,variables,Php,Wordpress,Function,Variables,首先,PHP不支持您尝试使用嵌套函数的方式 你可以这样写: function partners($atts ) { extract(shortcode_atts(array( 'ids' => null, 'extra_options' => 'something' <----------------- in wordpress I can read this value using local $extra_opti

首先,PHP不支持您尝试使用嵌套函数的方式

你可以这样写:

function partners($atts ) {
    extract(shortcode_atts(array(  
            'ids' => null,
            'extra_options' => 'something' <----------------- in wordpress I can read this value using local $extra_options 
    ), $atts));  
global $extra_options; <----------------- trying to change local var to global

function print_partners_scripts() {
    global $extra_options; <----------------- reading above variable
    echo '<script type="text/javascript">' . "\n";
    echo 'jQuery(document).ready( function() {'. "\n";
    echo '  $(".partners-slider").bxSlider({
        slideWidth: 924,
        auto: 0,
        autoStart: 0,
        moveSlides: 1,
        minSlides: 3,
        maxSlides: 8,
        pager: false,
        controls: false,
        slideMargin: 5,
        ' . $extra_options . ' <----------------- var is empty
     });' . "\n";
    echo '});' . "\n";
    echo '</script>' . "\n";
} 
    add_action( 'wp_footer', 'print_partners_scripts' );

    $ids = explode( ',', $ids );
    $output = '<div class="ps-wrap"><div class="partners-slider">';
    foreach($ids as $id) {    
    $img_attr = wp_get_attachment_image_src( $id, 'full' );
    $output .= '<div class="pslide"><img src="' . $img_attr[0] . '" /></div>';    
}
    $output .= '</div></div>';

    return $output;  
}  
但是,当执行
outer();
时,
inner()
函数被声明为一个普通函数。因此,代码与此完全相同:

function outer() { function inner() {} }
outer();
其次,PHP中的变量(除非带有前缀,带有类或对象名)总是作用于当前函数。关键字
global
将对全局变量的引用导入当前函数的作用域;它不能用于导出已定义的变量

通常最好只在函数的开头使用
global
关键字,以导入该函数所需的所有全局变量。更好的是,不要使用全局变量,因为它们会导致难以理解和调试的“意大利面代码”

如果在运行
extract
之前声明变量
global
,这将起作用,但是我强烈建议不要使用这两种功能

function outer() {}
function inner() {}
outer();
以下是没有不推荐功能的上述版本:

function foo_with_too_much_magic()
{
    // Import global variable. Very hard to track where this came from.
    global $some_var;
    // Let's assume this array comes from somewhere and isn't hard-coded
    $some_array = array('some_var' => 'some_value');
    // Export variables from an array. This is like telling PHP to write different code each time it runs, with different variable names.
    extract( $some_array );
}
foo_with_too_much_magic();
var_dump($some_var);

下面是一个将代码转换为类格式的示例,我将按照这个方向进行说明,学习更多的PHP()OOP实践可能会很有用:

#1)获取希望传递到函数中的数据。
$data=“TEST”;
获取合作伙伴(数据);
#2) 调用你的函数。
功能获取合作伙伴($atts){
//使用从呼叫中传入的($att)提取。
//包含此函数的文件应该可以访问shortcode_atts函数。
提取(短码)附件(数组)(
'ids'=>null,
'extra\u options'=>'something'//在wordpress中,我可以使用本地$extra\u选项读取此值
)美元(附件);;
//创建一个新的类元素,它将为您的应用程序构建数据,并允许您动态地传递变量。
$p=新合伙人();
$p->extra_options=$atts;//在此处传递变量。
$p->print_partners_scripts();
}
#3) 在这里定义类。
班级伙伴{
var$额外期权;
公共函数打印\u伙伴\u脚本()
{
$output=“”。“\n”;
$output.='jQuery(document).ready(function(){'。“\n”;
$output.='$(“.partners slider”).bxSlider({
滑动宽度:924,
自动:0,
自动启动:0,
第一,,
米斯利德斯:3,
最大幻灯片数:8,
传呼机:错,
控件:false,
幻灯片摘要:5,
“.$this->extra_选项”
})“;”。“\n”;
$output.='});'.“\n”;
$output.=''。\n“;
$output.=$this->附加_数据();
echo$输出;
}
受保护的功能附加_数据()
{
添加操作('wp_footer'、'print_partners_scripts');
$ids;#这是在哪里定义的?
$ids=分解(“,”,$ids);
$output='';
foreach($id作为$id)
{
$img_attr=wp_get_attachment_image_src($id,'full');
$output.='';
}
$output.='';
返回$output;
}
}

您是否在另一个函数(partners)中定义了一个函数(print\u partners\u scripts)?为什么?!您实际上在任何地方调用print\u partners\u scripts()吗?您是否调用partners()首先?不赞成使用globals。您应该将信息传递到函数中,或者使用会话来存储数据。@JacobS您得到了该声明的官方来源吗?globals是不受欢迎的,但不是不受欢迎的。@OIS--很公平,我将我的评论修改为“高度不鼓励使用globals”。“如果在运行导出之前声明变量为全局变量,这将起作用,但我强烈建议不要使用这两种功能。“成功了;)谢谢你的时间和宝贵的建议!@user2587741我在答案中添加了这一点来解释它失败的原因,但请不要编写这样的代码!我在答案中添加了一个示例,说明如何编写代码而不必依赖
导出
全局
的魔力。OOP可能是有益的(尽管这里可能有点过分),但这使用了它自己的一些非常糟糕的实践:
get_partners
函数应该在类内,可能是一个静态函数;它仍然不必要地使用
extract
var
应该替换为
public
;函数名通常应该是动词,因此
附加的
should应该是
获取额外的数据,或者最好是更具描述性的数据。哦,“class元素”,我想你指的是“instance”。在本例中,get_partners函数不在类/实例内部,因为它是创建类/实例的函数。尽管它的一些逻辑确实可以移动到类/实例本身中。您是否建议在函数外部创建类?这就是为什么我建议它是静态函数,所以您可以运行
Partners::get_Partners($data)
。或者它可以是类的构造函数,这样您就可以运行
$Partners=newpartners($data);$Partners->print_Partners_scripts();
。很有可能,它会在其他函数中,包含页面上需要的所有函数调用。
function foo_with_no_magic()
{
    // Let's assume this array comes from somewhere and isn't hard-coded
    $some_array = array('some_var' => 'some_value');
    // You know which variable you want, so don't need the magic "export"
    // Note that you don't have to call it $some_var
    $some_var = $some_array['some_var'];

    // Now you have the variable, you can manipulate it, pass it to another function, or return it
    // In fact, you could also return $some_array['some_var'] directly, without the extra assignment
    return $some_var;
}

// This variable name no longer needs to be the same as what was used in the foo_with_no_magic() function
$some_var = foo_with_no_magic();
var_dump($some_var);
#1) Get the data you wish to pass into your function.
$data = "TEST";  
get_partners($data);

#2) Call your function.
function get_partners($atts) {
    //Extract using ($att) passed in from your call.
    //The shortcode_atts function should be accessible by the file containing this function.
    extract(shortcode_atts(array(
    'ids' => null,
    'extra_options' => 'something' //in wordpress I can read this value using local $extra_options
    ), $atts));
    //Create a new class element that will build your data for your and allow you to pass in your variable on the fly.
    $p = new partners();
    $p->extra_options= $atts; //Pass the variable here.
    $p->print_partners_scripts();
}

#3) Define Class here.
class partners {
    var $extra_options;

    public function print_partners_scripts()
    {
        $output = '<script type="text/javascript">' . "\n";
        $output .= 'jQuery(document).ready( function() {'. "\n";
        $output .= '  $(".partners-slider").bxSlider({
        slideWidth: 924,
        auto: 0,
        autoStart: 0,
        moveSlides: 1,
        minSlides: 3,
        maxSlides: 8,
        pager: false,
        controls: false,
        slideMargin: 5,
        ' . $this->extra_options . '
        });' . "\n";
        $output .= '});' . "\n";
        $output .= '</script>' . "\n";            
        $output .= $this->additional_data();
        echo $output;
    }

    protected function additional_data()
    {
        add_action( 'wp_footer', 'print_partners_scripts' );
        $ids; #Where is this defined?
        $ids = explode( ',', $ids );
        $output = '<div class="ps-wrap"><div class="partners-slider">';

        foreach($ids as $id)
        {
            $img_attr = wp_get_attachment_image_src( $id, 'full' );
            $output .= '<div class="pslide"><img src="' . $img_attr[0] . '" /></div>';
        }

        $output .= '</div></div>';
        return $output;
    }
}