函数返回一个循环php
是否有可能返回一个循环?不是结果,而是自我循环。 我想在php中创建一个函数。例如像这样。函数返回一个循环php
function myloop($sql){
$query = mysql_query($sql);
return while(mysql_fetch_assoc($query))
}
我想创建这个的原因是为了避免重复代码。任何人都可以帮助我?谢谢..
不,你不能。你可以通过一个函数的功能,但:
// The myloop function, with another name.
function query($sql, $rowcallback)
{
$query = mysqli_query($sql); // use mysqli, not mysql
while
(($row = mysql_fetch_assoc($query)) &&
call_user_func($rowcallback, $row));
}
// The code to process a row.
function processRow(array $row)
{
// Use your row here..
var_dump($row);
return true; // You can return false to break processing.
}
//calling:
query($yourSelf, 'processRow');
不是按名称传递的功能,你也可以使用匿名函数,这取决于你的PHP版本:
//calling:
query($yourSelf,
function(array $row)
{
var_dump($row);
return true; // You can return false to break processing.
});
是函数从被叫方拨打的电话通常称为回拨。 call_user_func是调用回调的最佳方式,因为它也会接受方法和静态方法,而不仅仅是函数,所以你更灵活。
号
你可以,例如,返回可能包含一个循环匿名函数,但你只能从功能,而不是语言结构返回值。
不,但你可以模拟一个Iterator
为稳定发布的PHP截至今天。在PHP 5.5中,也会有接近的生成器。
$lazyQuery = new SqlResultItertor($sql);
foreach ($lazyQuery as $assoc) {
$assoc; # the result, one per row
}
BTW:PDO
和MySqli
提供本已开箱(不懒查询,但结果是穿越),为MySQL你需要写这样一个迭代器结果对象自己。
对于部分功能相关代码mysql_*
,请参阅this answer。然而,今天的一般建议是使用PDO或mysqli代替,这些提供更多的开箱即用。见How to successfully rewrite old mysql-php code with deprecated mysql_* functions?
你应该把它翻出来!
,而不是返回循环的,你能做到这一点使用Variable functions这样:
function myloop($sql, $myFunction){
$query = mysql_query($sql);
while(mysql_fetch_assoc($query)) {
$myFunction($result);
}
}
function doSomethingWithTheResult($result) {
echo $result; // just to have something here...
}
//now the usage:
myloop("SELECT 1", 'doSomethingWithTheResult');
随着一眯,这类似于Template method OOP设计模式的概念。
没有,但你可以做
function loopdate($sql,$code)
{
$query=mysql_query($sql)
while (mysql_fetch_assoc($query))
{
eval($code);
}
}
但是 - EVAL是非常可笑的危险真的很灰心。
function loopdate($sql,$function)
{
$query=mysql_query($sql)
while ($data=mysql_fetch_assoc($query))
{
$function($data);
}
}
会更好。
myfunc($data)
{
foreach ($data as $key->$value)
{
print "<tr><td>".$key."<td><td>".$value."</td></tr>\n";
}
}
所以,你可以调用
loopdate("select * from mytable","myfunc");
在PHP 5.5以上就可以,使用yield
关键字,而不是return
(这被称为generator):
function myloop($sql) {
$query = mysql_query($sql);
while (($row = mysql_fetch_assoc($query))) {
yield $row;
}
}
foreach (myloop('SELECT * FROM foo') as $row) {
// do something with $row
}
这是与使用旧PHP中的迭代器可以做的事情没有什么不同,但代码更清晰。
为什么downvotes?好的,这个问题并不是最高质量的,但有一个很好的意图 - 减少代码重复。只是这个想法不好,但我认为这个问题也可能在更多的人身上产生,并且提供一个很好的答案可能会在未来变得更加棘手。 – ppeterka
@ppeterka同意 – GolezTrol
@GolezTrol很高兴看到我们有同样的想法:) – ppeterka