一直到最后

导航

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类文件

upload successful
从上面两者的实现代码可以看出普通传值方式简单简洁,方法属性类传值代码实现相对繁琐,还要多写一个类文件。既然这样的话为什么还要有方法属性类传值的方式呢?

试想一下,当参数还少的时候没什么问题,但是当参数多的时候,这样传递代码很难看,也有人说可以直接把所有参数放到一个数组里面,然后直接传递那个数组参数即可,但是这里又有一个问题,就是你传递的数组里面有什么值其他人是无法一眼看出的,而且数组也可以传递所需参数外的其他参数,这样很不利于其他人维护。

原文作者: 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类文件

upload successful

并且上面的方法属性类传值方式还可以进一步优化
优化如下:
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

posted on 2020-05-05 11:55  一直到最后  阅读(193)  评论(0编辑  收藏  举报