Using object property as default for method property
-
08-06-2019 - |
Question
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();
}
}
Solution
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();
}
OTHER TIPS
Neat trick with boolean OR operator:
public function createShipment($startZip, $endZip, $weight = 0){
$weight or $weight = $this->getDefaultWeight();
...
}
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();
}
You can use a static class member to hold the default:
class Shipment
{
public static $DefaultWeight = '0';
public function createShipment($startZip,$endZip,$weight=Shipment::DefaultWeight) {
// your function
}
}
Improving upon Kevin's answer if you are using PHP 7 you may do:
public function createShipment($startZip, $endZip, $weight=null){
$weight = $weight ?: $this->getDefaultWeight();
}