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

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

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

    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();
    }
    
  2. Это позволит вам пройти вес 0 и все еще работать правильно. Обратите внимание на оператор===, это проверяет, соответствует ли вес «null» как в значении, так и в типе (в отличие от==, который является просто значением, поэтому 0 == null == false).

    РНР:

    public function createShipment($startZip, $endZip, $weight=null){
        if ($weight === null)
            $weight = $this->getDefaultWeight();
    }
    
  3. Можно использовать статический член класса для хранения значения по умолчанию:

    class Shipment
    {
        public static $DefaultWeight = '0';
        public function createShipment($startZip,$endZip,$weight=Shipment::DefaultWeight) {
            // your function
        }
    }
    
  4. Ловкий трюк с логическим оператором или:

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