我的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
变量是否为数组。
但我觉得必须有更有效的方法,我们可以缩短代码。有什么建议吗?
答案 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()似乎正是您所寻找的。 p>
另外,请查看此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
}
}
}