2010-09-29 24 views
15

Tôi đang sử dụng PHP 5.2.6. Tôi muốn có một giá trị mặc định cho một đối số trong một phương pháp, nhưng có vẻ như tôi nhận được một chút quá thông minh.Tôi có thể thiết lập đối số phương thức mặc định với thuộc tính lớp trong PHP không?

Thuộc tính lớp blnOverwrite được đặt mặc định và có thể đặt ở nơi khác trong lớp học. Tôi có một phương pháp mà tôi muốn nó có thể được đặt lại, nhưng không ghi đè lên giá trị hiện tại. Tôi gặp lỗi khi tôi thử điều này:

public function place($path, $overwrite = $this->blnOverwrite) { ... } 

Tôi phải làm điều gì đó như thế này?

public function place($path, $overwrite = NULL) { 
    if (! is_null($overwrite)) { 
     $this->blnOverwrite = $overwrite; 
    } 
    ... 
} 
+3

có thats đúng cách – Galen

Trả lời

11

Có, bạn phải thực hiện theo cách này. Bạn không thể sử dụng giá trị thành viên cho giá trị đối số mặc định.

From the PHP manual on Function arguments: (nhấn mạnh tôi)

Một chức năng có thể xác định C++ - giá trị mặc định phong cách cho các đối số vô hướng. […] PHP cũng cho phép sử dụng các mảng và kiểu đặc biệt NULL làm giá trị mặc định. […] Giá trị mặc định phải là một biểu thức liên tục, không phải (ví dụ) một biến, một thành viên của lớp hoặc một cuộc gọi hàm. […] Lưu ý rằng khi sử dụng đối số mặc định, bất kỳ giá trị mặc định nào sẽ nằm ở bên phải của bất kỳ đối số không mặc định nào; nếu không, mọi thứ sẽ không hoạt động như mong đợi.

0

bạn chỉ có thể rút ngắn nó một chút:

public function place($path, $overwrite = NULL) { 
    if(!is_null($overwrite))$this->blnOverwrite = $overwrite; 
    ... 
} 

nhưng thats gần giống

3

Bạn phải làm điều đó theo cách đó, afaik, hoặc sử dụng một lớp liên tục kể từ PHP 5.3 nhưng tất nhiên của nó cố định và không thể được thay đổi sau đó vì vậy tôi chắc chắn sẽ đi với giải pháp của riêng bạn:

class foo{ 
    const constant = 'bar'; 

    public function place($path, $overwrite = self::constant) { 
     die('bla' . $overwrite); 
    } 
} 

$bar = new foo(); 
$bar->place('baz'); 
10

Bạn hoàn toàn có thể làm điều này. Tốt nhất của cả hai thế giới: khởi tạo thuộc tính mặc định của bạn VÀ đối số mặc định của phương thức của bạn với hằng số lớp.

class Object { 

    const DEFAULT_BLNOVERWRITE = TRUE; 

    protected $blnOverwrite = self::DEFAULT_BLNOVERWRITE; 

    public function place($path, $overwrite = self::DEFAULT_BLNOVERWRITE) { 
     var_dump($overwrite); 
    } 
} 

$Object = new Object(); 
$Object->place('/'); //bool(true) 
Các vấn đề liên quan