类方法:何时传递参数以及何时使用属性?

时间:2015-10-18 16:27:01

标签: php oop

我在这里有点困惑,我在谷歌上找到的所有例子都是用其他语言编写的,我更加困惑。

我应该定义我的方法来获取参数或直接使用类的属性吗?

我确信一个例子会有所帮助:

使用接收参数的方法分类

class distance {
    public function kilometersToMeters($kilometers) {
        return $kilometers * 1000;
    }
}

$obj = new distance();
echo $obj->kilometersToMeters(4);

使用该方法直接处理类

的类的类
class distance {
    private $kilometers;

    public function __construct($kilometers) {
        $this->kilometers = $kilometers;
    }

    public function kilometerToMeters() {
        return $this->kilometers * 1000;
    }
}

$obj = new distance(4);
echo $obj->kilometerToMeters();

1 个答案:

答案 0 :(得分:0)

这实际上取决于您尝试建模的对象类型。如果您正在构建距离计算器服务,其唯一目的是在距离之间进行转换,那么您可以使用第一种方法,因为您的对象不会有任何状态,只有行为。

如果要对具有状态和行为的对象建模,则第二种形式更合适,因为您可以使用必填字段初始化对象,并验证构造中的对象。例如:

<?php
class Person {
    private $fullName;
    private $dateOfBirth;

    public function __construct($fullName, $dateOfBirth) {
        $this->checkInitializationVariables($fullName, $dateOfBirth);

        $this->fullName = $fullName;
        $this->dateOfBirth = $dateOfBirth;
    }

    public function getAge() {
        // calculate and return based on current date
    }

    public function getAgeAtDate($dateToCompare) {
        // calculate and return based on given date
    }

    private function checkInitializationVariables($fullName, $dateOfBirth) {
        if (empty($fullName)) {
            throw new Exception('Person must have a name.');
        }
        if (empty($dateOfBirth)) {
            throw new Exception('Person must have a date of birth.');
        }
    }
}

$person = new Person("John Doe", "01/01/2000");
echo $person->getAge();
echo $person->getAgeAtDate("01/01/2030");

现在你有一个具有状态(名称和生日)和行为(返回年龄)的对象。您还需要检查初始化,以确保您的对象在创建时有效。