Biến $ này có nghĩa là gì trong PHP?


103

Tôi thấy biến $thistrong PHP mọi lúc và tôi không biết nó được sử dụng để làm gì. Cá nhân tôi chưa bao giờ sử dụng nó.

Ai đó có thể cho tôi biết biến $thishoạt động như thế nào trong PHP không?

Câu trả lời:


130

Đó là một tham chiếu đến đối tượng hiện tại, nó thường được sử dụng nhất trong mã hướng đối tượng.

Thí dụ:

<?php
class Person {
    public $name;

    function __construct( $name ) {
        $this->name = $name;
    }
};

$jack = new Person('Jack');
echo $jack->name;

Điều này lưu trữ chuỗi 'Jack' như một thuộc tính của đối tượng được tạo.


1
Đã thấy mã ví dụ tương tự trong hướng dẫn KillerPHP OOP :) killerphp.com/tutorials/php-objects-page-1
Edson,

Tốt và dễ giải thích. @meder omuraliev
Pie

40

Cách tốt nhất để tìm hiểu về $thisbiến trong PHP là thử nó với trình thông dịch trong các ngữ cảnh khác nhau:

print isset($this);              //true,   $this exists
print gettype($this);            //Object, $this is an object 
print is_array($this);           //false,  $this isn't an array
print get_object_vars($this);    //true,   $this's variables are an array
print is_object($this);          //true,   $this is still an object
print get_class($this);          //YourProject\YourFile\YourClass
print get_parent_class($this);   //YourBundle\YourStuff\YourParentClass
print gettype($this->container); //object
print_r($this);                  //delicious data dump of $this
print $this->yourvariable        //access $this variable with ->

Vì vậy, biến $thisgiả có phương thức và thuộc tính của đối tượng hiện tại. Một thứ như vậy rất hữu ích vì nó cho phép bạn truy cập tất cả các biến thành viên và các phương thức thành viên bên trong lớp. Ví dụ:

Class Dog{
    public $my_member_variable;                             //member variable

    function normal_method_inside_Dog() {                   //member method

        //Assign data to member variable from inside the member method
        $this->my_member_variable = "whatever";

        //Get data from member variable from inside the member method.
        print $this->my_member_variable;
    }
}

$thislà tham chiếu đến một PHP Objectđược tạo bởi trình thông dịch cho bạn, chứa một mảng các biến.

Nếu bạn gọi $thisbên trong một phương thức bình thường trong một lớp bình thường, hãy $thistrả về Đối tượng (lớp) mà phương thức đó thuộc về.

Có thể $thiskhông được xác định nếu ngữ cảnh không có Đối tượng cha.

php.net có một trang lớn nói về lập trình hướng đối tượng PHP và cách $thishoạt động tùy thuộc vào ngữ cảnh. https://www.php.net/manual/en/language.oop5.basic.php


Lời giải thích tuyệt vời. Chỉ muốn nói thêm rằng $ này có thể được coi là đối tượng / biến giả giúp truy cập các thuộc tính của lớp hiện tại.
S.Alvi

17

Tôi biết câu hỏi cũ của nó, dù sao thì một lời giải thích chính xác khác về $ này . $ này chủ yếu được sử dụng để chỉ các thuộc tính của một lớp.

Thí dụ:

Class A
{
   public $myname;    //this is a member variable of this class

function callme() {
    $myname = 'function variable';
    $this->myname = 'Member variable';
    echo $myname;                  //prints function variable
    echo $this->myname;              //prints member variable
   }
}

đầu ra:

function variable

member variable

9

Nó là cách để tham chiếu một thể hiện của một lớp từ bên trong nó, giống như nhiều ngôn ngữ hướng đối tượng khác.

Từ tài liệu PHP :

Biến giả $ này khả dụng khi một phương thức được gọi từ bên trong ngữ cảnh đối tượng. $ đây là một tham chiếu đến đối tượng đang gọi (thường là đối tượng mà phương thức thuộc về, nhưng có thể là một đối tượng khác, nếu phương thức được gọi tĩnh từ ngữ cảnh của một đối tượng phụ).


7

Hãy xem điều gì sẽ xảy ra nếu chúng ta không sử dụng $ this và cố gắng có các biến phiên bản và đối số hàm tạo có cùng tên với đoạn mã sau

<?php

class Student {
    public $name;

    function __construct( $name ) {
        $name = $name;
    }
};

$tom = new Student('Tom');
echo $tom->name;

?>

Nó không vang vọng gì ngoài

<?php

class Student {
    public $name;

    function __construct( $name ) {
        $this->name = $name; // Using 'this' to access the student's name
    }
};

$tom = new Student('Tom');
echo $tom->name;

?>

điều này vọng lại 'Tom'


2
Cả hai đoạn mã của bạn đều giống hệt nhau, hay tôi đang thiếu thứ gì đó?
Demento

@Demento: vâng. Tôi đã sửa nó, sử dụng $thistrong hàm tạo thứ hai.
Axel Guilmin

Bạn có vui lòng giải thích tại sao name = $ name không cho phép tôi truy cập tên của học sinh không? Nó không có ý nghĩa đối với tôi.
Marco Floriano

Mario, đó là vì phạm vi. bên trong hàm $namelà Tom, nhưng bên ngoài hàm, nó không có bất kỳ giá trị nào, bởi vì phạm vi của nó bị giới hạn trong phạm vi của hàm.
dearsina

4

khi bạn tạo một lớp, bạn có (trong nhiều trường hợp) các biến cá thể và phương thức (hay còn gọi là. hàm). $ this truy cập các biến cá thể đó để các hàm của bạn có thể nhận các biến đó và làm những gì chúng cần làm bất cứ điều gì bạn muốn với chúng.

một phiên bản khác của ví dụ về meder:

class Person {

    protected $name;  //can't be accessed from outside the class

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}
// this line creates an instance of the class Person setting "Jack" as $name.  
// __construct() gets executed when you declare it within the class.
$jack = new Person("Jack"); 

echo $jack->getName();

Output:

Jack


2

$ đây là một biến đặc biệt và nó tham chiếu đến cùng một đối tượng tức là. chinh no.

nó thực sự tham chiếu phiên bản của lớp hiện tại

đây là một ví dụ sẽ xóa câu lệnh trên

<?php
 class Books {
  /* Member variables */
  var $price;
  var $title;

  /* Member functions */
  function setPrice($par){
     $this->price = $par;
  }

  function getPrice(){
     echo $this->price ."<br/>";
  }

  function setTitle($par){
     $this->title = $par;
  }

  function getTitle(){
     echo $this->title ." <br/>";
  }
}
?> 

xin hãy giải thích nó ít hơn
Neeraj Rathod

2

Đây là lời giải thích chi tiết dài. Tôi hy vọng điều này sẽ giúp ích cho những người mới bắt đầu. Tôi sẽ làm cho nó rất đơn giản.

Đầu tiên, hãy tạo một lớp

<?php 

class Class1
{
    
}

Bạn có thể bỏ qua thẻ đóng php ?>nếu chỉ sử dụng mã php.

Bây giờ hãy thêm thuộc tính và một phương thức vào bên trong Class1.

<?php 

class Class1
{
    public $property1 = "I am property 1";
    public $property2 = "I am property 2";

    public function Method1()
    {
        return "I am Method 1";
    }
}

Thuộc tính chỉ là một biến đơn giản, nhưng chúng tôi đặt cho nó tên thuộc tính vì nó nằm trong một lớp.

Phương thức chỉ là một hàm đơn giản, nhưng chúng ta nói rằng phương thức này cũng nằm trong một lớp.

Các publictừ khóa có nghĩa là phương pháp hay một tài sản có thể được truy cập bất cứ nơi nào trong kịch bản.

Bây giờ, làm thế nào chúng ta có thể sử dụng các thuộc tính và phương thức bên trong Class1?

Câu trả lời là tạo một thể hiện hoặc một đối tượng, hãy nghĩ về một đối tượng như một bản sao của lớp.

<?php 

class Class1
{
    public $property1 = "I am property 1";
    public $property2 = "I am property 2";

    public function Method1()
    {
        return "I am Method 1";
    }
}

$object1 = new Class1;
var_dump($object1);

Chúng tôi đã tạo một đối tượng, đó là $object1bản sao của Class1tất cả nội dung của nó. Và chúng tôi đã vứt bỏ tất cả các nội dung $object1sử dụng var_dump().

Điều này sẽ cung cấp cho bạn

object(Class1)#1 (2) { ["property1"]=> string(15) "I am property 1" ["property2"]=> string(15) "I am property 2" }

Vì vậy, tất cả nội dung của Class1đều ở trong $object1, ngoại trừ Method1, tôi không biết tại sao các phương thức không hiển thị trong khi kết xuất các đối tượng.

Bây giờ nếu chúng ta chỉ muốn truy cập thì sao $property1. Nó đơn giản, chúng tôi làm var_dump($object1->property1);, chúng tôi chỉ thêm ->property1, chúng tôi chỉ vào nó.

chúng tôi cũng có thể truy cập Method1(), chúng tôi làm var_dump($object1->Method1());.

Bây giờ, giả sử tôi muốn truy cập $property1từ bên trong Method1(), tôi sẽ làm điều này

<?php 

class Class1
{
    public $property1 = "I am property 1";
    public $property2 = "I am property 2";

    public function Method1()
    {   
        $object2 = new Class1;
        return $object2->property1;
    }
}

$object1 = new Class1;
var_dump($object1->Method1()); 

chúng tôi đã tạo $object2 = new Class1;bản sao mới của Class1hoặc có thể nói là một phiên bản. Sau đó, chúng tôi chỉ đến property1từ$object2

return $object2->property1;

Điều này sẽ in string(15) "I am property 1"trong trình duyệt.

Bây giờ thay vì làm điều này bên trong Method1()

$object2 = new Class1;
return $object2->property1;

Chúng tôi làm điều này

return $this->property1;

Đối $thistượng được sử dụng bên trong lớp để tham chiếu đến chính lớp đó.

Nó là một giải pháp thay thế cho việc tạo đối tượng mới và sau đó trả lại nó như thế này

$object2 = new Class1;
return $object2->property1;

Một vi dụ khac

<?php 

class Class1
{
    public $property1 = 119;
    public $property2 = 666;
    public $result;

    public function Method1()
    {   
        $this->result = $this->property1 + $this->property2;
        return $this->result;
    }
}

$object1 = new Class1;
var_dump($object1->Method1());

Chúng tôi đã tạo 2 thuộc tính chứa các số nguyên và sau đó chúng tôi thêm chúng vào và đưa kết quả vào $this->result.

Không được quên điều đó đấy

$this->property1= $property1=119

chúng có cùng giá trị .. vv

Tôi hy vọng điều đó giải thích ý tưởng.

Chuỗi video này sẽ giúp ích cho bạn rất nhiều trong OOP

https://www.youtube.com/playlist?list=PLe30vg_FG4OSEHH6bRF8FrA7wmoAMUZLv


1

Nó đề cập đến thể hiện của lớp hiện tại, như meder đã nói.

Xem Tài liệu PHP . Nó được giải thích trong ví dụ đầu tiên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.