Использование свойства объекта по умолчанию для свойства метода

Я пытаюсь сделать это (что приводит к неожиданной ошибке T_VARIABLE):

public function createShipment($startZip, $endZip, $weight = 
$this->getDefaultWeight()){}

Я не хочу "defaultWeight"указывать здесь магическое число для веса, поскольку у объекта, который я использую, есть параметр, который получают все новые партии, если вы не укажете вес. Я не могу поместить defaultWeightсаму отправку, потому что она меняется от группы отгрузки к группе отгрузки. Есть ли лучший способ сделать это, чем следующий?

public function createShipment($startZip, $endZip, weight = 0){
    if($weight <= 0){
        $weight = $this->getDefaultWeight();
    }
}
4.08.2008 17:51:13
5 ОТВЕТОВ
РЕШЕНИЕ

Это не намного лучше:

public function createShipment($startZip, $endZip, $weight=null){
    $weight = !$weight ? $this->getDefaultWeight() : $weight;
}

// or...

public function createShipment($startZip, $endZip, $weight=null){
    if ( !$weight )
        $weight = $this->getDefaultWeight();
}
13
4.08.2008 17:53:00

Трюк с логическим оператором ИЛИ:

public function createShipment($startZip, $endZip, $weight = 0){
    $weight or $weight = $this->getDefaultWeight();
    ...
}
6
28.08.2008 08:10:48

Это позволит вам пройти вес 0 и по-прежнему работать правильно. Обратите внимание на оператор ===, он проверяет, соответствует ли вес «null» как по значению, так и по типу (в отличие от ==, который является просто значением, поэтому 0 == null == false).

PHP:

public function createShipment($startZip, $endZip, $weight=null){
    if ($weight === null)
        $weight = $this->getDefaultWeight();
}
1
5.08.2008 12:49:44
[@ pix0r] (# 2213) Это хороший момент, однако, если вы посмотрите на исходный код, если вес передается как 0, он использует вес по умолчанию.
Kevin 6.08.2008 22:58:35

Вы можете использовать статический член класса для хранения значений по умолчанию:

class Shipment
{
    public static $DefaultWeight = '0';
    public function createShipment($startZip,$endZip,$weight=Shipment::DefaultWeight) {
        // your function
    }
}
1
28.04.2016 15:05:59

Улучшение ответа Кевина, если вы используете PHP 7, вы можете сделать:

public function createShipment($startZip, $endZip, $weight=null){
    $weight = $weight ?: $this->getDefaultWeight();
}
0
4.06.2019 09:34:14