实例化没有显式构造函数的类是否合法?

时间:2017-07-22 21:56:09

标签: php

我最近创建了两个代码示例来测试构造函数在php中的工作方式,一个使用显式构造函数,另一个没有。两个输出都是一样的。

实例化没有显式构造函数的类是否合法?

带构造函数的代码

array (
  0 => 
  array (
    'stdid' => '11',
    'tid' => 
    array (
      0 => '1',
      1 => '4',
      2 => '5',
      3 => '2',
      4 => '3',
    ),
  ),
  1 => 
  array (
    'stdid' => '12',
    'tid' => 
    array (
      0 => '4',
      1 => '5',
      2 => '2',
      3 => '3',
      4 => '1',
    ),
  ),
)

---

array (
  11 => 
  array (
    'tid' => 
    array (
      0 => '5',
      1 => '2',
      2 => '1',
      3 => '3',
      4 => '4',
    ),
  ),
  12 => 
  array (
    'tid' => 
    array (
      0 => '2',
      1 => '4',
      2 => '1',
      3 => '3',
      4 => '5',
    ),
  ),
)

没有构造函数的代码

<?php
class Circle {
      const PI = 3.14;
      public $radius;

//Constructor method 
       public function __construct($r) {
             $this->radius = $r;
       }

       public function calculate() {
             return 2 * self::PI * $this->radius;
       }
}

//Argument passed during instantiating
 $C = new Circle(7);
 echo ("Circumference of Circle: ".$C->calculate());
?>

1 个答案:

答案 0 :(得分:3)

添加构造函数方法是可选的。 documentation州:

  

PHP 5 允许开发人员为类声明构造函数方法。具有构造函数方法的类在每个新创建的对象上调用此方法。

但请注意,您的第二个实施并不理想:

  • calculate方法有副作用:它设置 radius 成员。这不是最佳实践:如果方法的主要目的是返回某个东西,那么它不应该改变该对象。

  • calculate方法要求您在每次调用时提供半径。当对象知道其半径时,这不是你想要的。