遇到PHP类问题

时间:2011-11-06 00:03:12

标签: php arrays oop class

我的PHP类就是这样。

 <?php
class htmlize {

    protected $base_dir;

    public function __construct( $base_dir = 'core/code/js/' )
    {
        $this->base_dir = $base_dir;
    }

    public function gimme_js_link ($list, $folder = '')
    {
        if(is_array($list)) {
        $links=array();
        foreach ($list as $name)
        {
            $links[]=$this->make_js_link ($name, $folder);
        }
        print_r ($links);
        }
        else {echo $this->make_js_link ($list, $folder);}
     }

     protected function make_js_link ($name, $folder)
     {
         $dir = $this->base_dir . $folder . '/';
         return '<script src="' . $dir . $name . '.js"></script>';
     }

  }

?>

将其称为

<? $js= new htmlize(); $js->gimme_js_link('jquery', 'libs'); ?>

问题是我如何才能在这个类中为'jquery, ... , ...'这样的数组或为前'jquery'的单个元素工作?目前我对gimme_js_link方法进行了更改:它在处理之前检查$list变量是否为数组。

但我觉得必须有更有效的方法,我们可以缩短代码。有什么建议吗?

5 个答案:

答案 0 :(得分:1)

通常以这种方式完成:

if(!is_array($input))
    $input = array($input);

对于你的字符串,你必须明确地编写一些函数,将它转换为数组。我建议通过一些正则表达式检查它是否是一个列表的字符串,如果是,请使用单独的函数将其转换为数组。

答案 1 :(得分:1)

我取出了类属性,因此可以快速在codepad上运行。

<?php
function gimme_js_link( $list, $folder = '')
{
    $list = explode( ',', $list);
    $links = array();
    foreach( $list as $name)
    {
        $links[] = make_js_link( trim( $name), $folder);
    }
    echo implode( '', $links);
} 

function make_js_link ($name, $folder)
{
    $dir = $folder . '/';
    return '<script src="' . $dir . $name . '.js"></script>';
}

gimme_js_link( 'jquery, functions, files', 'libs');
echo "\n";
gimme_js_link( 'jquery', 'libs');

<强>输出:

<script src="libs/jquery.js"></script><script src="libs/functions.js"></script><script src="libs/files.js"></script>
<script src="libs/jquery.js"></script>

答案 2 :(得分:1)

看起来你已经正确编码了,就在你调用gimme_js_link()函数时,将第一个参数作为数组传递,无论你有一个列表项还是多个项。这样做可以跳过代码中的数组检查部分。将修改后的调用引用到函数:

<? $js= new htmlize(); $js->gimme_js_link(array('jquery'), 'libs'); //for single list item. ?> 
<? $js= new htmlize(); $js->gimme_js_link(array('jquery','custom_script','another_script'), 'libs'); //for multiple list items ?> 

如果以这种方式调用,则可以跳过代码中的数组检查部分,并直接使用foreach循环处理$ list变量。

您想要的是一个名为变量参数的功能。您可以在哪里指定参数将接受多个参数。由于PHP没有像Java中那样的变量参数功能(您可以参考here获取java示例),因此数组是在php中实现此功能的方法。

答案 3 :(得分:0)

虽然阵列解决方案不是太糟糕,但func_get_args()似乎正是您所寻找的。

另外,请查看此discussion.

答案 4 :(得分:0)

这样的事情会发生,但我会高度劝阻这种模式。如果不在docblock中给出相当大的描述,那么理解语法是不容易的。这也是完全错误的。

<?php

class htmlize
{
    public function gimme_js_link()
    {
        if (2 > func_num_args())
        {
            // Throw an exception if argument count is incorrect
            throw new BadMethodCallException('Method needs at least one library file to load and a directory to load it from.');
        }

        $list = func_get_args();
        $dir = array_pop($list);

        foreach ($list as $item)
        {
            // Load $item from $dir
        }
    }
}