2016-12-03 74 views
1

在类声明中使用构造函数和直接属性赋值分配属性值有什么区别?换句话说,以下两段代码为新对象创建默认值有什么区别?在类声明中使用构造函数和属性赋值分配属性值有什么区别?

代码直接分配:

<?php 
class A { 
    public $name="aName"; 
    public $weight = 80; 
    public $age = 25; 
    public $units = 0.02 ; 
} 
?> 

代码构造:

<?php 
class A { 
    public $name; 
    public $weight; 
    public $age; 
    public $units; 
    public function __construct() { 
     $this->name = "aName"; 
     $this->weight = 80; 
     $this->age = 25; 
     $this->units= 0.02 ; 
    } 
} 
?> 

你可能会回答,我不能改变硬编码的性能,但我可以在下面的代码(在Local Sever):

<?php 
    class A{ 
    public $name="aName"; 
    public $weight = 80; 
    public $age = 25; 
    public $units = 0.02 ; 
    } 
class B extends A{ 
    public function A_eat(){ 
     echo $this->name.' '."is".' '.$this->age.' '."years old<br>"; 
     echo $this->name.' '."is eating".' '.$this->units.' '."units of food<br>"; 
     $this->weight +=$this->units; 
     echo $this->name.' '."weighs".' '.$this->weight."kg"; 
    } 
    } 
    $b = new B(); 
    echo "<p>If no changes to the object's Properties it inherits the main class's</p>"; 
    $b->A_eat(); 
    echo '<br><br>'; 
    echo "<p>If changes made to the object's Properties it uses it's new properties</p>"; 
    $b->name ="bName"; 
    $b->weight = 90; 
    $b->units = 0.05; 
    $b->A_eat(); 
?> 
+0

这里有什么问题?对于一个你的构造方法是不正确的,你错过了你的支架括号减速,为什么你会公开一些东西,如果你使用一个方法来访问它在setter/getter? – KDOT

+0

您的示例中充满了语法错误(例如'$ weight->')。这就是说,你不能在没有构造函数的情况下动态设置值。 – Qirel

+0

这是我的错误,我添加了括号。但我的问题是为什么要使用构造函数,我可以给该属性声明中的默认值?..请忘记语法。 –

回答

2

当属性声明包含初始化时,在编译时间处,即在将PHP源编译为PHP opcodes的步骤中评估初始化。

在构造函数中的代码在运行时间处被评估,即在用new运算符创建对象时。

如果您不使用操作码高速缓存(OPcache,APC和类似的扩展),几乎没有区别。但是,如果操作码被缓存,显然,编译时初始化的性能会更好。

0

然而,没有什么,但...

在结构(),你可以通过在可选变量...例如..

public function __construct($name = 'aName', $weight = 80, $age = 25, $units = 0.02) { 
    $this->name = $name; 
    $this->weight = $weight; 
    $this->age = $age; 
    $this->units = $units; 
} 

在您发布,要定义HARD值的特性,第一个例子是在第二一个,构建会让你 “打造” 那些......

在第一个例子:

$x = new Class(); 
// You can't change it, those properties are what you coded in... 

现在看看我的例子...

$x = new Class('My New Name', 120, 30, 0.10); 
// Now $name = 'My New Name' etc... 

的结构可以让你建立在初始化的对象,而不是坚硬如你有编码的默认值...

你可以使用默认值,并创建制定者,但我喜欢的__construct()

0

这两者之间没有什么大的区别。

这两种方法都很好,它基本上取决于您的使用情况。

根据第一种方法你都无法将值分配给类的成员,而在第二个方法创建一个类的对象,而你有力量,让我证明这一点:在方法上第二

class A 
{ 
    protected $name = 'John'; 
    protected $age = 20; 
} 

$obj = new A(); 
/* Here you get an object with 
** $obj->name = 'John' 
** $obj->age = 20; 
*/ 

而你具有在旅途中定义变量的能力(在定义其对象时)。每次你创建B类的对象,你可以根据你的传递参数给类的构造函数具有不同的对象,每次:它有一个构造方法调用每个 新创建的对象上此方法

class B 
{ 
    protected $name; 
    protected $age; 

    public function __construct($name = 'John', $age = 20) 
    { 
     $this->name = $name; 
     $this->age = $age; 
    } 
} 

$obj = new B("John Doe", 40); 
/* Here you get an object with 
** $obj->name = 'John Doe' 
** $obj->age = 40; 
*/ 

$obj = new B("John Doe"); 
/* Here you get an object with 
** $obj->name = 'John Doe' 
** $obj->age = 20; 
*/ 

类,所以它适用于在使用之前对象可能需要的任何初始化

希望这有助于!

0

因为构造函数可以接收参数以使对象以某些默认值以外的值开始。没有带参数的构造函数,你必须创建一个默认对象,然后修改它的字段。

还要注意总有一个构造函数;这只是一个问题,你是否自己创建了一个,或者为你创建了一个不需要任何参数的默认的问题。

0

在这种情况下,构造函数只是将对象置于活动状态,分配适当的内存。

可以创建一个Person对象,只需提供一个名称作为参数,但当名称和年龄都作为参数给定时,可能需要另一个构造函数。

在PHP中,你被限制为1不幸的是,_contruct

您可以在周围的工作方式shown here但内置多个构造。

0

构造方法和对象属性之间的区别和什么时候应该使用它们?

首先,construct()返回比如,你正在使用的类,因此为什么如果你曾经尝试返回的东西这个方法里面不同:

public function __construct() { return 'hello, world!'; } 

它不会实际工作。你可能在问这是什么意思,为什么它对于这个问题如此重要。那么,有不止两种方式来访问属性中的数据,有些东西我们称为获取者设置者

private $_name; 
public function setName($name) { $this->_name = $name; return $this; } 
public function getName() { return $this->_name; } 

在您的使用情况,我认为你的数据是不不断,它并不总是会成为25时代,所以你可以使用多种方式来处理这一点。如果数据来自数据库,构造方法将加载像这样的配置是有用的:

public $name; 
public function __construct($id) { 
    $user = SomeDriver::GetInstance()->on('Users', '*')->where('user_id = ?', [$id]); 
    $this->name = $user['username']; 
} 

然后你就可以只通过像$obj->name实例访问。但是,如果您只是通过输入设置数据,则可以使用setter/getter或直接访问范围外的属性;

class User { 
    public $name = 'Frank'; 
    public function setName($name) { $this->name = $name; return $this; } 
    public function getName() { return $this->name; } 
} 

$u = new User; 
echo $u->name; 
$u->name = 'John'; 

// or change the property to private and: 

$u = new User; 
echo $u->getName(); 
$u->setName('John'); 
相关问题