Thursday, February 3, 2011

Using object property as default for method property

I'm trying to do this (which produces an unexpected T_VARIABLE error):

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

I don't want to put a magic number in there for weight, since the object I am using has a "defaultWeight" parameter that all new shipments get if you don't specify a weight. I can't put the defaultWeight in the shipment itself, because it changes from shipment group to shipment group. Is there a better way to do it than the following?

public function createShipment($startZip, $endZip, weight = 0){
if($weight <= 0){
$weight = $this->getDefaultWeight();
}
}
  • This isn't much better:

    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();
    }
    From Kevin
  • This will allow you to pass a weight of 0 and still work properly. Notice the === operator, this checks to see if weight matches "null" in both value and type (as opposed to ==, which is just value, so 0 == null == false).

    PHP:

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

    That is a good point, however, if you look at the original code if the weight is passed as 0 it uses the default weight.

    From Kevin
  • try using a static class member.

    class Shipment
    {
        public static $DefaultWeight = '0';
        public function createShipment($startZip,$endZip,$weight=Shipment::DefaultWeight){
        //you function
        }
    }
    
    From paan
  • Neat trick with boolean OR operator:

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

0 comments:

Post a Comment