php定义方法属性类比普通传值的优点
原文作者: xingguang
原文链接:https://www.tiance.club/post/2520600556.html
普通传值:是指直接将参数从一个方法传到另一个方法,最简单暴力的方式。
方法属性类:将需要传递的所有值以方法属性类的方式定义出来,需要用时直接取出即可。
两者的代码实现方式
1、普通传值方式
public function testDetail(){
$this->returnDetail('小李',10);
}
private function returnDetail($name,$age){
print_r([$name,$age]);exit;
}
2、方法属性类方式
public function testDetail(){
$data=(new HumanDetail());
$data->setName('小李');
$data->setAge(10);
$this->returnDetail($data);
}
private function returnDetail(HumanDetail $data){
print_r([$data->getName(),$data->getAge()]);exit;
}
HumanDreail类文件
从上面两者的实现代码可以看出普通传值方式简单简洁,方法属性类传值代码实现相对繁琐,还要多写一个类文件。既然这样的话为什么还要有方法属性类传值的方式呢?
试想一下,当参数还少的时候没什么问题,但是当参数多的时候,这样传递代码很难看,也有人说可以直接把所有参数放到一个数组里面,然后直接传递那个数组参数即可,但是这里又有一个问题,就是你传递的数组里面有什么值其他人是无法一眼看出的,而且数组也可以传递所需参数外的其他参数,这样很不利于其他人维护。
原文作者: xingguang
原文链接:https://www.tiance.club/post/2520600556.html
方法属性类方式比普通传值的优点
例如下面的案例:
1、普通传值
public function testDetail(){
$name='小李';
$age=10;
$sex='男';
$type=1;
$a='a';
$b='b';
$c='c';
$d='d';
$e='e';
$f='f';
$g='g';
$this->returnDetailA($name,$age,$sex,$type,$a,$b,$c,$d,$e,$f,$g);
$this->returnDetailB($name,$age,$sex,$type,$a,$b,$c,$d,$e,$f,$g);
}
private function returnDetailA($name,$age,$sex,$type,$a,$b,$c,$d,$e,$f,$g){
print_r([$name,$age,$sex,$type,$a,$b,$c,$d,$e,$f,$g]);
}
private function returnDetailB($name,$age,$sex,$type,$a,$b,$c,$d,$e,$f,$g){
print_r([$name,$age,$sex,$type,$a,$b,$c,$d,$e,$f,$g]);exit;
}
2、方法属性类方式
public function testDetail(){
$data=(new HumanDetail());
$data->setName('小李');
$data->setAge(10);
$data->setSex('男');
$data->setType(1);
$data->setA('a');
$data->setB('b');
$data->setC('c');
$data->setD('d');
$data->setE('e');
$data->setF('f');
$this->returnDetailA($data);
$this->returnDetailB($data);
}
private function returnDetailA(HumanDetail $data){
print_r([$data->getName(),$data->getAge(),$data->getSex(),$data->getA(),$data->getB(),$data->getC(),
$data->getD(),$data->getE(),$data->getF()]);
}
private function returnDetailB(HumanDetail $data){
print_r([$data->getName(),$data->getAge(),$data->getSex(),$data->getA(),$data->getB(),$data->getC(),
$data->getD(),$data->getE(),$data->getF()]);exit;
}
HumanDreail类文件
并且上面的方法属性类传值方式还可以进一步优化
优化如下:
HumanDreail类文件
<?php
namespace app\components;
class HumanDetail
{
private $name='';
private $age=0;
private $sex='';
private $type=0;
private $a='';
private $b='';
private $c='';
private $d='';
private $e='';
private $f='';
public function __call($method,$args)
{
$perfix=strtolower(substr($method,0,3));
$property=strtolower(substr($method,3));
if(empty($perfix) || empty($property)) return;
if($perfix=="get" && isset($this->$property)) return $this->$property;
if($perfix=="set")$this->$property=$args[0];
// if($perfix=="set"){
//开启强类型判断,对于php这种弱类型语言来说开启后对线上稳定会造成隐患
// if(gettype($this->$property) == gettype($args[0]) ){
// $this->$property=$args[0];
// }else{
// throw new \BaseComponents\base\Exception(['-1',$property." is wrong type, {$property} is ".gettype
// ($this->$property)." and args is ".gettype($args[0])]);
// }
// }
}
}
从上面可以看出,当传参参数变多了且当有多个接收方的时候,代码可维护性就变高了,接收方只需要从对应的类文件中需要自己需要的参数即可,不用这样多参数的传递,而且这还只是一层传递方式而已,如果是多层传递的话,那代码看上去就相对冗余难以维护。
总结:两者的优缺点
普通传值
优点:
1、传值参数少,业务场景简单时,简洁明了。
缺点:
1、传值参数多,业务场景复杂时,代码可读性差,拓展性差。
2、传递层次多时,代码可读性和拓展性差的缺点会更加明显。
方法属性类
优点:
1、传值参数多,业务场景复杂时,代码可读性高,便于团队开发,拓展性强。
2、传递层次多时,代码可读性和拓展性强的优势会更加明显。
缺点:
1、传值参数少,业务场景简单时,代码量相对于普通传值方式更多。
一般来说一个业务的未来变化情况是可以预测到的,正确的选择对应的传值方式,有利于代码的可维护性和拓展性,更加有利于代码的健壮性。
原文作者: xingguang
原文链接:https://www.tiance.club/post/2520600556.html