2009-06-12 82 views
1

嗨,我不明白为什么php书的作者在公共函数__construct($ disks = 1)中使用$ disks = 1?关于PHP 5实践中的一个例子的问题

我试图只用$ disks替换$ disks = 1,它也起作用。为什么作者会这样做?

<?php 
// Define our class for Compact disks 
class cd { 
    // Declare variables (properties) 
    public $artist; 
    public $title; 
    protected $tracks; 
    private $disk_id; 

    // Declare the constructor 
    public function __construct() { 
     // Generate a random disk_id 
     $this->disk_id = sha1('cd' . time() . rand()); 
    } 

    // Create a method to return the disk_id, it can't be accessed directly 
    // since it is declared as private. 
    public function get_disk_id() { 
     return $this->disk_id; 
    } 
} 

// Now extend this and add multi-disk support 
class cd_album extends cd { 
    // Add a count for the number of disks: 
    protected $num_disks; 

    // A constructor that allows for the number of disks to be provided 
    public function __construct($disks = 1) { 
     $this->num_disks = $disks; 

     // Now force the parent's constructor to still run as well 
     // to create the disk id 
     parent::__construct(); 
    } 

    // Create a function that returns a true or false for whether this 
    // is a multicd set or not? 
    public function is_multi_cd() { 
     return ($this->num_disks > 1) ? true : false; 
    } 
} 

// Instantiate an object of class 'cd_album'. Make it a 3 disk set. 
$mydisk = new cd_album(3); 

// Now use the provided function to retrieve, and display, the id 
echo '<p>The compact disk ID is: ', $mydisk->get_disk_id(), '</p>'; 

// Use the provided function to check if this is a a multi-cd set. 
echo '<p>Is this a multi cd? ', ($mydisk->is_multi_cd()) ? 'Yes' : 'No', '</p>'; 
?> 

回答

13

他为$磁盘设置默认值,所以如果你实例化类不带参数,$磁盘将被设置为1

例子:

class Foo { 
    function __construct($var = 'hello') { 
     print $var; 
    } 
} 

f = new Foo('hi'); // prints 'hi' 
f = new Foo(); // prints 'hello' 
+0

没什么可说的,除了一个参考:http://docs.php.net/manual/en/functions.arguments.php – 2009-06-12 22:40:35

2

这就是所谓的默认。如果没有值发生了$磁盘设置其调用时,它会自动采用默认设置,在这种情况下,1

但是,如果你改变的方法是:

__construct($disks = 1, $somethingElse) 

它止跌”工作。如果您提供默认值,则以下值还必须具有默认值。更有趣的是,如果你这样做:

__construct($somethingElse, $disks = 1) 

它会工作。