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