2009-07-16 20 views
10

Tôi muốn biết nếu nó được chấp nhận/ưa thích sử dụng phương thức self :: method() và parent ::() khi làm việc trong các lớp php.

Bạn có thể sử dụng $ this-> method() nhưng $ this-> cũng có thể tham chiếu đến biến lớp, biến lớp cha hoặc phương thức từ lớp cha. Không có sự mơ hồ trong bản thân ::

Tự ngã :: và không có bất kỳ cảnh báo hoặc phản đối nào khi sử dụng kiểu này?

Tôi hiểu rằng self :: và parent :: tham chiếu đến một thể hiện tĩnh của lớp, nhưng trong kohana, trừ khi bạn xác định cụ thể một phương thức tĩnh, có vẻ như không có sự khác biệt.

Cảm ơn.

Added một ví dụ: Giả sử ứng dụng này các cửa hàng các diễn đàn từ nhiều trang web ...

class Forum_Controller extends Controller { 

    function __construct() 
    { 
     parent::__construct(); 
    } 

    function index() 
    { 
     echo self::categories(); 
    } 

/* 
* get a list of categories from a specific site. 
*/ 
    private function categories() 
    { 
     $db = new Database; 
     $categories = $db->query(" 
      SELECT * FROM 
      forum_categories 
      WHERE fk_site = '$this->site_id' 
     "); 
     $view = new View('categories_view'); 
     $view->categories = $categories; 
     return $view; 
    } 

} 

ví dụ này hoạt động trong Kohana với báo cáo lỗi thiết lập để: error_reporting (E_ALL & ~ E_STRICT);

$ this-> site_id được định nghĩa trong lớp Controller_Core chính (thư viện ở kohana).

Theo như tôi biết, $ điều này không được phép có sẵn vì tôi đang tự gọi :: danh mục() theo cách tĩnh, nhưng chỉ khi tôi xác định danh mục() là tĩnh thì nó phát ra lỗi . Tuy nhiên, như tôi đã nói, tôi thích sử dụng self :: vì từ góc độ dễ đọc, tôi biết chính xác vị trí của hàm này, thay vì sử dụng $ điều này gây ra sự mơ hồ, đối với tôi.

+1

Lý do mã này làm việc là bởi vì bạn không bao giờ được đề cập đến một $ trường hợp này của các đối tượng trong các tĩnh gọi là phương pháp loại. – null

Trả lời

6

Bộ điều khiển không tĩnh ở Kohana, mặc dù chúng có thể chứa biến/phương thức hoặc hằng số thành viên tĩnh.

self:: là một cách viết tắt của văn bản ClassName:: tức là

class Animal 
{ 
    public static $arms = 0; 
} 

class Dog extends Animal 
{ 
    public static $leg = 0; 
    const NAME = 'dog'; 

    public static function bark() 
    { 
     echo 'Woof'; 
    } 
} 

Để gọi chức năng tĩnh hoặc nhận được hằng số từ một lớp học, chúng tôi sử dụng toán tử phân giải phạm vi ::. Các hàm tĩnh là cho mỗi lớp không phải cho mỗi đối tượng.Nói rằng :: đề cập đến các cá thể tĩnh của một lớp là sai, nó chỉ là một cách để truy cập các phương thức tĩnh - không có một cá thể đối tượng có các phương thức này.

vậy:

Dog::bark(), 
Dog::$leg, 
Dog::NAME, 

chúng ta cũng có thể sử dụng

Animal::$arms 

Bên trong Chó lớp chúng ta có thể sử dụng self::parent:: để chúng ta không cần phải gõ tên lớp đầy đủ (vì nó có thể rất dài!)

Trong câu trả lời cho câu hỏi của bạn, mặc dù: Không - self:: không được dùng nữa và thực tiễn không sử dụng nó là không tồi. Lý do nó không được sử dụng trong lõi kohana là vì một lý do rất khác nhau .... (các lớp mở rộng trong suốt với eval đọc bên dưới để biết thêm thông tin ...).

p.s gọi phương thức không tĩnh tĩnh là sai và không được phép - nếu bạn đặt error_reporting(E_ALL | E_STRICT) (như bạn nên trong quá trình phát triển), bạn sẽ thấy lỗi được nâng lên.

Về cơ bản những gì xảy ra là:

Core có một tập tin gọi là:

class Controller_Core { 
    public function someMethod(){} 
} 

Bạn tạo:

// We can use someMethod of Controller_Core 
Index_Controller extends Controller {} 

này được thực sự mở rộng Controller_CoreTRỪ bạn đã tạo MY_Controller .php sẽ là class Controller extends Controller_Core.

//MY_Controller.php 
class Controller extends Controller_Core 
{ 
     // overloads Controller_Core::someMethod without us having to change the core file 
     public function someMethod(){} 
} 
+0

Cảm ơn bạn đã dành thời gian giải thích điều này. Nó rất hữu ích. Bây giờ tôi hiểu ý của bạn là "Hàm tĩnh là mỗi lớp không phải cho mỗi đối tượng". Tôi sẽ đọc các tài liệu được cung cấp bởi benlumley, nhưng tôi vẫn còn bối rối bởi thực tế là mã của tôi vẫn hoạt động: Tôi đã nối thêm một số mã ví dụ cho câu hỏi của tôi, xin hãy xem. Cảm ơn một lần nữa. – superjadex12

0

Tôi nghĩ self :: thường được sử dụng cho các hàm và thuộc tính tĩnh.

Tôi sử dụng Kohana và có lẽ các trình điều khiển được tạo thành tĩnh.

16

Có sự khác biệt.

$this đề cập đến một thể hiện của một đối tượng.

parentself được sử dụng để gọi phương thức tĩnh.

This page of PHP's manual giải thích chi tiết hơn khi tôi có thời gian để viết vào lúc này. Ví dụ đầu tiên đặc biệt sẽ giúp làm nổi bật một số khác biệt. Tôi khuyến khích bạn sao chép dán ví dụ đầu tiên và lộn xộn về nó, vì tôi nghĩ rằng đó là một khái niệm quan trọng để có được trong tâm trí của bạn nếu bạn không biết sự khác biệt.

+0

Cảm ơn bạn đã trả lời. Liên kết tài liệu rất hữu ích. Tôi không thể tìm ra những từ đúng để tìm nó, nếu không. – superjadex12

+0

cha mẹ không phải là (chỉ) được sử dụng để gọi phương thức tĩnh. Nếu nó được gọi từ ngữ cảnh Object, nó sẽ gọi hàm trong lớp cha với ngữ cảnh đối tượng. –

0

Tôi không thể thêm một bình luận (rõ ràng là tôi không có đại diện yêu cầu!)

class Forum_Controller extends Controller { 

public function __construct() 
{ 
    parent::__construct(); 
} 

public function index() 
{ 
    echo self::categories(); 
} 

/* 
* get a list of categories from a specific site. 
*/ 
private static function categories() 
{ 
    $db = new Database; 

    // You cannot use $this in a static function, because static functions are per class 
    // and not per object it doesnt know what $this is :) (make private static $site_id and use self::$site_id) if this is what you want 

    $categories = $db->query(" 
      SELECT * FROM 
      forum_categories 
      WHERE fk_site = '$this->site_id' 
    "); 
    $view = new View('categories_view'); 
    $view->categories = $categories; 
    return $view; 
} 

}

Giống như tôi đã nói, bạn nên sử dụng error_reporting (E_ALL | E_STRICT) ; (Thay đổi nó trong file Kohana)

gọi loại chức năng riêng() tĩnh làm việc do một lỗi trong PHP, bạn không nên có khả năng để làm điều đó :)

0

điều khác cần lưu ý bằng cách này là rằng đây không phải là thiết kế MVC rất tốt để làm cho các chức năng điều khiển tĩnh trả về danh sách các loại.

Bộ điều khiển để xử lý các yêu cầu, Mô hình là để xử lý dữ liệu (đây là gì) và Chế độ xem được hiển thị.

tạo mô hình!

class Category_Model extends Model 
{ 
     public function categories($site_id) 
     { 
      $categories = $this->db->from('forum_categories')->where('fk_site',$site_id)->get(); 

       return new View('categories_view', array('categories' => $categories)); 
     } 
} 

...

$cat = new Category_Model; 

echo $cat->categories(1); 
0

Tôi Nghiêm sử dụng tự :: chỉ cho các biến tĩnh và hàm thành viên tĩnh

Các vấn đề liên quan