Trong PHP, từ khóa self và this được dùng để chỉ các thành viên của lớp trong phạm vi của một lớp. Các thành viên của lớp có thể là biến hoặc hàm. Các từ khóa PHP này khác với hành vi tĩnh của các thành viên lớp
PHP từ khóa này đề cập đến một thành viên không tĩnh của một lớp đối với thể hiện của lớp được tạo. Vì vậy, các giá trị hoặc đối số của các thành viên lớp sẽ được thay đổi dựa trên giá trị mà thể hiện của lớp được tạo
Nếu chúng ta sử dụng từ khóa này mà không có ngữ cảnh đối tượng để chỉ dữ liệu tĩnh, thì lỗi sau sẽ được hiển thị cho trình duyệt
Fatal error: Using $this when not in object context in .. on Line
Vì vậy, chúng ta nên sử dụng từ khóa self ở những nơi như vậy để chỉ các thành viên tĩnh của lớp để tránh lỗi trên. Trong khi sử dụng self để chỉ dữ liệu tĩnh, chúng ta cần sử dụng toán tử phân giải phạm vi. Ví dụ,
Trong mẫu mã trên, chúng tôi đã chỉ ra cách biến tĩnh $menu được gọi là tự từ khóa PHP
Sự khác biệt giữa bản thân PHP và cái này
selfthisthe từ khóa self sẽ không được đặt trước bất kỳ biểu tượng nào; . Nhưng PHP từ khóa này nên được bắt đầu bằng dấu $ trong khi giới thiệu các thành viên của lớp. Toán tử phân giải phạm vi PHP sẽ được sử dụng với từ khóa self. Ví dụ, bản thân. -> biểu tượng được sử dụng với biến $this như chúng ta đã sử dụng với một thể hiện đối tượng để truy cập thuộc tính của đối tượng đó. Ví dụ: $this->It sẽ được sử dụng để chỉ một thành viên tĩnh của một lớp. cái này được sử dụng để truy cập các thành viên không tĩnh với toán tử ->. Bản thân PHP đang đề cập đến các thành viên của lớp, không dành cho bất kỳ trường hợp cụ thể nào; . Tuy nhiên, $this sẽ giới thiệu các thành viên của lớp cho một thể hiện cụ thể của lớpVí dụ. PHP tự Vs cái này
Chúng ta hãy xem sự khác biệt trên với một chương trình PHP đơn giản làm ví dụ để biết, các thành viên của lớp được gọi như thế nào với hai từ khóa PHP này
toys_name = $name;
$this->toys_category = $category;
}
public function getToyName[]
{
return $this->toys_name;
}
public function getToyCategory[]
{
return $this->toys_category;
}
public function getToyShop_nonStatic[]
{
return self::getToyShop[];
}
public static function getToyShop[]
{
return self::$shop_name;
}
public static function setToyShop[$shopname]
{
self::$shop_name = $shopname;
}
}
$objToys = new Toys["Battery Car", "Battery Toys"];
$toys_name = $objToys->getToyName[];
$toys_category = $objToys->getToyCategory[];
echo "
Toy: " . $toys_name . ", Category: " . $toys_category;
Toys::$shop_name = "Disney";
$shop_name = Toys::getToyShop[];
echo "
Shop Name: " . $shop_name;
Toys::setToyShop["ToyShop"];
$shopname = Toys::getToyShop_nonStatic[];
echo "
Shop Name via non static function: " . $shopname;
?>
Trong chương trình trên, chúng ta có ba biến thành viên cho lớp Đồ chơi. Hai trong số đó là không tĩnh, dự kiến sẽ được khởi tạo tự động trong khi tạo các thể hiện của lớp. Và, lớp chỉ chứa một biến tĩnh thường được gọi cho tất cả các phiên bản của lớp
Với các hàm tạo, các biến lớp được tham chiếu bằng cách sử dụng $this, để khởi tạo. Một lần nữa, bằng cách sử dụng biến $this, các biến thành viên đã khởi tạo được tham chiếu cho các getter của lớp được định nghĩa là một hàm thành viên không tĩnh, trả về các giá trị bắt buộc cho một thể hiện của lớp cụ thể
Mặt khác, các thành viên tĩnh được gọi là từ khóa self để trả về giá trị tĩnh của $shop_name bởi hàm thành viên tĩnh getToyShop[] của lớp Đồ chơi
Bên ngoài lớp, đầu tiên, chúng tôi đã tạo một thể hiện với hai đối số, để tự động gọi hàm tạo của lớp. Đối với đối tượng hoặc thể hiện này, các hàm thành viên không tĩnh được gọi để nhận giá trị của $toys_name và $toys_category. Bây giờ, các hàm thành viên sử dụng $this để chỉ các giá trị được khởi tạo khi khởi tạo
Và sau đó, các thành viên tĩnh được truy cập từ bên ngoài lớp bằng cách sử dụng chính tên lớp. Tuy nhiên, trong phạm vi lớp, chúng tôi đã sử dụng self để truy cập các thành viên đó. Trong chương trình này, chúng tôi đã truy xuất các giá trị biến tĩnh bằng cách sử dụng hàm thành viên không tĩnh getToyShop_nonStatic[], đồng thời
Sau khi thực hiện chương trình PHP trên, nó sẽ trả về đầu ra sau cho trình duyệt sẽ được hiển thị
PHP hỗ trợ các lớp và các cấu trúc hướng đối tượng khác. Các hàm và biến tĩnh trong các lớp PHP không được liên kết với bất kỳ thể hiện cụ thể nào của lớp [nói cách khác, một đối tượng]. Xem sự khác biệt giữa đối tượng và lớp
Thay vào đó, các hàm và biến tĩnh được liên kết với chính định nghĩa lớp. Nói cách khác, tất cả các phiên bản của một lớp chia sẻ cùng một biến tĩnh. Trong ngữ cảnh của một phương thức [hàm] của một lớp, các biến và hàm tĩnh được truy cập bằng cách sử dụng self::
. Các phương thức và biến khác được sử dụng trong ngữ cảnh của một đối tượng [một thể hiện] của một lớp, sử dụng this->
Biểu đồ so sánh
self so với biểu đồ so sánh nàyselfthisCó thể được sử dụng trong các hàm tĩnhCóKhôngCó thể tự truy cập biến lớp và phương thức. $this-> [Lưu ý rằng PHP > 5. 3 cho phép sử dụng $this với biến tĩnh sử dụng $this. $foo. $this->foo sẽ vẫn không được xác định nếu $foo là một var tĩnh. ] Cần một đối tượng khởi tạo Không Cóself vs this trong PHP - Ví dụ
class exampleClass { public static $foo; public $bar; public function regularFunction[] { echo $this->bar; } public static function staticFunction[] { echo self::$foo; } public static function anotherStatFn[] { self::staticFunction[]; } public function regularFnUsingStaticVar[] { echo self::$foo; } // NOTE: As of PHP 5.3 using $this::$bar instead of self::$bar is allowed } exampleClass::$foo = "Hello"; $obj = new exampleClass[]; $obj->bar = "World!"; exampleClass::staticFunction[]; /* prints Hello */ $obj->regularFunction[]; /* prints World! */
Các hàm tĩnh chỉ có thể sử dụng các biến tĩnh. Các hàm và biến tĩnh được tham chiếu qua self. functionName[] hoặc tự. tên biến. Trong ví dụ hiển thị ở trên, các biến tĩnh được tham chiếu với tên lớp [exampleClass. $foo] hoặc, với một self. [bản thân. $foo] khi được sử dụng trong phương thức tĩnh [có tên là staticFunction[]] của lớp
Các hàm và biến thông thường của một lớp cần có ngữ cảnh đối tượng để được tham chiếu. Chúng không thể tồn tại nếu không có bối cảnh đối tượng. Bối cảnh đối tượng được cung cấp bởi $this. Trong ví dụ trên, $bar là một biến thông thường và do đó nó được tham chiếu là $obj->bar [trong ngữ cảnh đối tượng có biến obj] hoặc $this->bar [một lần nữa trong ngữ cảnh đối tượng trong một phương thức của đối tượng
self không sử dụng $ trước vì self không bao hàm một biến mà lớp tự xây dựng. $this không tham chiếu đến một biến cụ thể nên nó có $ trước