2014-10-11 160 views
0

我试图覆盖一个函数的默认值,以便我可以自定义该函数。以下是目前发生的事情。覆盖一个函数的默认值

在该脚本加载

<?php require( dirname(__FILE__) . "/filters.php"); ?> 
<?php require( themes_path . "/2014/functions.php"); ?> 

filter.php

这是原来的功能顺序

/* Login Page */ 
if(!function_exists ("customize_login")){ 
    function customize_login($args = array()){ 
     $defaults = array(
      "image_url" => bs_url . "/system/bootstrap/images/logo.png", 
      "image_alt" => "Original ALT", 
      "image_title" => "Original Title", 
      "image_class" => "profile-img" 
     );   
     $args = array_merge($defaults, $args); 
     return $args; 
    } 
} 

的functions.php

我就在这里重写上述功能

/* Override the Login Page */ 
    $args = array(
     "image_alt" => "Override ALT", 
     "image_title" => "Override Title", 
     "image_class" => "profile-img" 
    ); 
    call_user_func("customize_login", $args); 

的login.php

这里就是我想用我对的functions.php覆盖功能文件

$customize_login = customize_login(); 
    if(is_array($customize_login)){ 
    $image_url = $customize_login["image_url"]; 
    $image_alt = $customize_login["image_alt"]; 
    $image_title = $customize_login["image_title"]; 
    $image_class = $customize_login["image_class"]; 
} 

问题?

我仍然得到原始函数值和不是覆盖函数值。我如何访问覆盖函数值?

回答

2

你并不需要调用方法customize_login地方你覆盖,你需要用覆盖调用它,当你需要的值被覆盖:

$args = array(
    "image_alt" => "Override ALT", 
    "image_title" => "Override Title", 
    "image_class" => "profile-img" 
); 

$customize_login = customize_login($args); 
    if(is_array($customize_login)){ 
    $image_url = $customize_login["image_url"]; 
    $image_alt = $customize_login["image_alt"]; 
    $image_title = $customize_login["image_title"]; 
    $image_class = $customize_login["image_class"]; 
} 

刚注意到,如果函数已经被定义或者没有定义,那么有一个有条件的检查周围customize_login()

所以,你应该能够通过在你自己的代码中声明它来代替整个函数。提供:

function customize_login($args){ 
     $myDefaults = array(
     "image_alt" => "Override ALT", 
     "image_title" => "Override Title", 
     "image_class" => "profile-img" 
    ); 
    $args = array_merge($myDefaults, $args); 
    return $args; 
} 

某处较早,原有的功能将永远不会被定义,但每次通话提供额外的参数 - 从框架内可能 - 即会正常运行。

+0

感谢您的回答。我想到了这一点,但没有实现这一点,因为我不想在开发后触摸login.php页面,因为它不会是安全升级。 – 2014-10-11 16:00:10

+3

只要'customize_login()'在不带'$ args'的情况下被调用,它将返回里面定义的默认值。 – dognose 2014-10-11 16:00:53

+0

@RedVirus看到我的编辑。 – dognose 2014-10-11 16:09:00