为啥使用?

函数应该只做一件事

这是迄今为止软件工程里最重要的一个规则。当函数做超过一件事的时候,他们就难于实现、测试和理解。当你隔离函数只剩一个功能时,他们就容易被重构,然后你的代码读起来就更清晰。如果你光遵循这条规则,你就领先于大多数开发者了。

Bad:

function emailClients($clients) {
foreach ($clients as $client) {
$clientRecord = $db->find($client);
if($clientRecord->isActive()) {
email($client);
}
}
}

Good:

function emailClients($clients) {
$activeClients = activeClients($clients);
array_walk($activeClients, 'email');
}

function activeClients($clients) {
return array_filter($clients, 'isClientActive');
}

function isClientActive($client) {
$clientRecord = $db->find($client);
return $clientRecord->isActive();
}

基本使用

<?php
function myfunction($value,$key)
{
echo "The key $key has the value $value<br>";
}
$a=array("a"=>"red","b"=>"green","c"=>"blue");
array_walk($a,"myfunction");
?>

具体使用demo

<?php

class demo1
{
public function index()
{
$a = array("a" => "red", "b" => "green", "c" => "blue");

array_walk($a, array(new demo2(), 'myfunction'), ['username'=>'liaosp']);

var_dump($a);
}
}

class demo2
{
/**
* @param $value
* @param $key
* @param array $userdata
* @var $username
*/
public function myfunction(&$value, $key, array $userdata)
{
$username ='';//来源userdata 数组
extract($userdata);
$value = $username;
}
}

//so good !!! demo3

class demo3{
public function emailClients($clients) {
$activeClients = $this->activeClients($clients);
array_walk($activeClients, array($this,'email'));
}

function activeClients($clients) {
return array_filter($clients, array($this,'isClientActive'));
}

public function isClientActive(array $client) {
$status = 0;//extract 赋值
extract($client);
if($status ==0){
return false;
}
return true;
}
public function email($value){
var_dump($value);
}

}

//$obj = new demo1();
//$obj->index();

$obj = new demo3();
$client = [
['username'=>'liaosp','status'=>1,'email'=>'liaosp@qq.com'],
['username'=>'mm','status'=>1,'email'=>'mm@qq.com'],
];
$obj->emailClients($client);