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

StackOverflow https://stackoverflow.com/questions/1453

  •  08-06-2019
  •  | 
  •  

Вопрос

Я пытаюсь сделать это (что приводит к неожиданной ошибке 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();
    }
}
Это было полезно?

Решение

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

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();
}

Другие советы

Аккуратный трюк с логическим оператором OR:

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

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

PHP:

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

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

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

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

public function createShipment($startZip, $endZip, $weight=null){
    $weight = $weight ?: $this->getDefaultWeight();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top