Php tự so với cái này so với tĩnh

Đây là chủ đề thú vị nhất và thường gây nhầm lẫn nhất giữa các nhà phát triển khi làm việc trên bất kỳ dự án nào. Trong hướng dẫn này, chúng ta sẽ bắt đầu hiểu về selfthis trong PHP & sẽ biết khi nào nên sử dụng self

// OUTPUT

1
1
2
2
1 trong PHP khi phát triển & sẽ hiểu cách chúng ta có thể sử dụng self &
// OUTPUT

1
1
2
2
1 trong các tình huống khác nhau

Vì vậy, câu hỏi cơ bản xuất hiện trong đầu, self là gì?

Như chúng ta biết rằng khi chúng ta tạo bất kỳ lớp nào thì lớp đó chứa các hằng, biến hay còn gọi là “thuộc tính” và hàm hay còn gọi là “phương thức”

Trong OOP, để truy cập các thành phần lớp này, chúng ta có thể sử dụng $this OR self trong PHP. Điều đó có nghĩa là, chỉ trong PHP chúng ta mới có thể sử dụng những cách này để kiểm soát các thành phần lớp khác nhau. Điều này có thể khác nhau dựa trên ngôn ngữ lập trình bạn sử dụng

Mục lục

bản thân là gì. trong PHP?

Một lớp có thể chứa sự hợp nhất của các thành viên tĩnh và không tĩnh. Để truy cập các thành viên tĩnh của lớp, chúng tôi sử dụng self cùng với toán tử phân giải phạm vi

// OUTPUT

1
1
2
2
7. Toán tử phân giải phạm vi này còn được gọi là Paamayim Nekudotayim (có nghĩa là dấu hai chấm trong tiếng Do Thái) hoặc nói một cách đơn giản hơn là dấu hai chấm. Các phương thức tĩnh cũng được chỉ định là các hàm toàn cầu được đặt tên

Các hàm và biến tĩnh được liên kết với chính lớp đó. Nó có nghĩa là bất kể giá trị mà các biến tĩnh nắm giữ, nó sẽ được chia sẻ giữa tất cả các đối tượng được tạo khác

Nói một cách đơn giản, giả sử chúng tôi cập nhật biến tĩnh bằng cách sử dụng

// OUTPUT

1
1
2
2
8, sau đó sử dụng
// OUTPUT

1
1
2
2
9, chúng tôi lại thử truy cập vào cùng một biến tĩnh thì chúng tôi sẽ nhận được cùng một giá trị và ngược lại

Hãy xem mã trong hành động-

updateBookInfo(1);

echo $objBooks->getBookId();

// object 2
$newObjBook = new books;
echo $newObjBook->getBookId();
$newObjBook->updateBookInfo(2);

// after update
echo $objBooks->getBookId();
echo $newObjBook->getBookId();
// OUTPUT

1
1
2
2

Được rồi, vì vậy trong ví dụ này, chúng tôi đã tạo một lớp sách trong đó chúng tôi đã xác định một biến tĩnh (

bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
0) và để truy cập nó, chúng tôi đã xác định phương thức
bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
1. Bây giờ, trước hết, chúng ta đã tạo một đối tượng sách và gán giá trị cho một biến tĩnh
bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
0 bằng phương thức
bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
3

Phương pháp này sử dụng cú pháp

bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
4 để cập nhật một biến lớp
bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
0. Sau khi được chỉ định, giờ đây nó có thể có sẵn để sử dụng trong và ngoài lớp học

Chúng ta có thể truy cập giá trị này bằng cách sử dụng phương thức

bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
1 từ bên trong hoặc bên ngoài lớp HOẶC trực tiếp sử dụng lớp (
bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
7) từ bên ngoài lớp

Tiếp theo, chúng ta đã định nghĩa một đối tượng khác

// OUTPUT

1
1
2
2
9. Bây giờ, chúng ta sẽ nhận được cùng một giá trị của
bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
0 khi sử dụng đối tượng này vì thuộc tính của biến cấp độ lớp

Một lần, chúng tôi cập nhật giá trị của biến tĩnh này bằng cách sử dụng

bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
3 e. g. , 2 trong trường hợp của chúng tôi, thì giá trị đó sẽ có sẵn cho tất cả các đối tượng (bao gồm các đối tượng hiện tại, tiếp theo và trước đó)

Vì vậy,

// OUTPUT

123
1 &
// OUTPUT

123
2 sẽ cho cùng một giá trị i. e. , 2

Làm thế nào chúng ta có thể truy cập các thành viên tĩnh của lớp?

Vì vậy, chúng ta đã hiểu cơ bản về cách định nghĩa các biến tĩnh, cách chúng ta có thể truy cập nó và cách tất cả các thể hiện của một lớp chia sẻ cùng một biến tĩnh.

Có nhiều cách khác nhau để chúng ta có thể truy cập biến tĩnh

Vì vậy, các biến & hàm tĩnh được truy cập thông qua

// OUTPUT

123
3 &
// OUTPUT

123
4 tương ứng (từ bên trong lớp). Trong ví dụ hiển thị ở trên, một biến tĩnh được truy cập bằng cách sử dụng
// OUTPUT

123
5 khi chúng ta ở trong lớp

Nhưng từ bên ngoài lớp, chúng ta cần sử dụng

bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
7 vì biến tĩnh là biến cấp độ lớp. Vì vậy, không cần tạo một đối tượng lớp để truy cập các biến tĩnh của nó. Chúng ta có thể truy cập trực tiếp nó thông qua className sau đó toán tử phân giải phạm vi (
// OUTPUT

1
1
2
2
7 ) theo sau là tên biến

Đôi khi chúng ta cũng thấy từ khóa

// OUTPUT

123
8 có nhiệm vụ truy cập các phương thức của lớp cha. Cú pháp này thường được tìm thấy bên trong phương thức như
// OUTPUT

123
9 nơi chúng ta đưa nó vào dòng đầu tiên bên trong một hàm để kế thừa tất cả dữ liệu hàm tạo của lớp cha. Chúng ta cũng có thể sử dụng parent. trong các phương pháp khác là tốt. Nhưng sự thật là không có mối quan hệ như vậy giữa bản thân. & cha mẹ

$this trong PHP là gì?

// OUTPUT

1
1
2
2
1 đại diện cho tham chiếu đến đối tượng hiện tại của lớp.
// OUTPUT

1
1
2
2
1 là biến giả được tạo ngay khi đối tượng của lớp được tạo và có sẵn để sử dụng khi phương thức lớp đó được gọi từ bên trong ngữ cảnh đối tượng

Hãy hiểu $this bằng cách sử dụng ví dụ cơ bản-

bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
// OUTPUT

123

Như chúng ta có thể thấy, chúng ta đã định nghĩa hai phương thức trong lớp

bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
  public function getCurrentObjInfo() {
      print_r($this);
  }
}

$objBook = new books;
$objBook->setBookId(123);
$objBook->name = "Jack";
echo $objBook->getCurrentObjInfo();
2 và một phương thức được sử dụng để đặt bookId và một phương thức khác được sử dụng để lấy bookId. Đối với điều này, chúng tôi đã sử dụng biến
// OUTPUT

1
1
2
2
1 vì chúng tôi ở trong lớp và chúng tôi đang xử lý các biến không tĩnh của lớp từ bên trong ngữ cảnh đối tượng

Vậy,

// OUTPUT

1
1
2
2
1 chứa gì?
// OUTPUT

1
1
2
2
1 chứa tất cả các thuộc tính có sẵn trong lớp. Có thể có một quan niệm sai lầm rằng khi chúng ta in
// OUTPUT

1
1
2
2
1 thì nó sẽ đưa ra danh sách tất cả các thành viên trong phạm vi của lớp

Nhưng điều này là không đúng sự thật.

// OUTPUT

1
1
2
2
1 sẽ in tất cả các biến hiện có và biến mới được liên kết với chính lớp đó

Vâng đó là sự thật. Chúng ta cũng có thể tự động thêm (các) biến mới để sử dụng tạm thời cho lớp. Bây giờ bạn có thể bối rối vì chúng ta đã thấy rất nhiều ví dụ có chứa việc sử dụng các thuộc tính được định nghĩa trong lớp

Hãy sử dụng cùng một ví dụ về lớp sách và xác định các biến động được xác định bên ngoài lớp

bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
  public function getCurrentObjInfo() {
      print_r($this);
  }
}

$objBook = new books;
$objBook->setBookId(123);
$objBook->name = "Jack";
echo $objBook->getCurrentObjInfo();
// OUTPUT

books Object 
( 
   [bookId] => 123 
   [name] => Jack 
)

Chúng tôi đã định nghĩa một phương thức mới

bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
  public function getCurrentObjInfo() {
      print_r($this);
  }
}

$objBook = new books;
$objBook->setBookId(123);
$objBook->name = "Jack";
echo $objBook->getCurrentObjInfo();
8 và bên trong nó, chúng tôi đã in đối tượng hiện tại bằng cách truyền tham số
// OUTPUT

1
1
2
2
1. Tại dòng số 22, chúng tôi đã xác định một biến mới và gán nó cho đối tượng
// OUTPUT

books Object 
( 
   [bookId] => 123 
   [name] => Jack 
)
0

Vì vậy, khi chúng tôi gọi phương thức mới này là

bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
  public function getCurrentObjInfo() {
      print_r($this);
  }
}

$objBook = new books;
$objBook->setBookId(123);
$objBook->name = "Jack";
echo $objBook->getCurrentObjInfo();
8 thì nó sẽ không chỉ in các biến hiện có mà còn cả các biến động mới được xác định

Bây giờ, hãy thảo luận về chủ đề chính

Khi nào sử dụng bản thân. trong PHP?

Đây là câu hỏi lớn nhất mà mọi người phải đối mặt khi phát triển bất kỳ phần mềm nào. Những phương thức/thuộc tính lớp nào nên là tĩnh và TẠI SAO?

Ở phần trên, chúng ta đã thấy rằng

// OUTPUT

1
1
2
2
1 đại diện cho tham chiếu đến đối tượng hiện tại của lớp, trong khi self tham chiếu đến chính lớp hiện tại

Để hiểu điều này, hãy tạo một lớp người và sau đó chúng ta sẽ thấy việc sử dụng các thuộc tính/phương thức tĩnh có thể hữu ích như thế nào

name   = $name;
    $this->age    = $age;
    $this->height = $address;
    $this->weight = $familyMembers;
  }

  public function get_name()
  {
    return $this->name;
  }

  public function get_age()
  {
    return $this->age;
  }

  public function get_address()
  {
    return $this->address;
  }

  public function get_family_members()
  {
    return $this->familyMembers;
  }

  public static function set_voting_age($age)
  {
    self::$votingAge = $age;
  }

  public static function get_voting_age()
  {
    return self::$votingAge;
  }
}

Vì vậy, về cơ bản chúng ta đã định nghĩa lớp Person và cũng đã thêm bốn thuộc tính name, age, address & familyMembers

Sau đó, chúng tôi đã tạo biến bỏ phiếu tĩnhAge vì khai báo bỏ phiếuAge tĩnh, chúng tôi đảm bảo rằng mọi đối tượng được tạo bằng cách sử dụng lớp Person phải chứa cùng một giá trị bỏ phiếu tĩnhAge

Điều này là để chúng tôi đảm bảo rằng ngay cả khi chúng tôi tạo ra càng nhiều đối tượng thuộc lớp người càng tốt nhưng tất cả các đối tượng sẽ có cùng độ tuổi biểu quyết

Một ưu điểm khác của việc tạo thuộc tính tĩnh HOẶC biến phương thức

// OUTPUT

books Object 
( 
   [bookId] => 123 
   [name] => Jack 
)
3 thành tĩnh là chúng ta không cần tạo đối tượng lớp Person để truy cập giá trị mặc định củavotingAge. Chúng tôi có thể truy cập trực tiếp bằng cách sử dụng
// OUTPUT

books Object 
( 
   [bookId] => 123 
   [name] => Jack 
)
4

Khi nào nên sử dụng $this trong PHP?

Ngược lại với khi sử dụng self. trong PHP, sử dụng $this chỉ hữu ích khi chúng ta thực sự cần tạo một đối tượng của lớp để định nghĩa và truy cập các thành viên không tĩnh của lớp

$this chỉ sử dụng bên trong các phương thức của lớp. Vì vậy, một khi đối tượng của lớp (e. g. , Person) được tạo sau đó để truy cập tất cả các thành viên chúng ta cần sử dụng biến giả $this

name   = $name;
  }

  public function get_name()
  {
    return $this->name;
  }

Chúng tôi đã rút gọn ví dụ trên và chỉ sử dụng hàm get_name() để truy cập tên của người đó. Vì tên thuộc tính này có thể có tên khác tùy thuộc vào giá trị được truyền cho hàm tạo

Vì vậy, để truy cập thuộc tính này, chúng ta cần sử dụng biến $this

Tóm lại, hãy xem sự khác biệt giữa bản thân. và $này

Sự khác biệt giữa self và $this trong PHP

self$thisself tham chiếu đến chính lớp hiện tại$this biểu thị tham chiếu đến đối tượng hiện tại của lớpKhông cần khởi tạo một đối tượng để truy cập các thành viên tĩnh Cần tạo đối tượng để truy cập các phương thức và các biến. được sử dụng để truy cập các biến/phương thức tĩnh của lớp$cái này được sử dụng để truy cập các biến/phương thức không tĩnh của lớp

Phần kết luận

Chúng ta đã thấy sự hiểu biết sâu sắc về self và $this trong PHP. Vì vậy, về cơ bản, chúng ta cần đảm bảo rằng trong khi tạo bất kỳ lớp nào, mục đích của lớp này là gì và các thành phần khác nhau của lớp sẽ giúp lớp đó hoàn thiện như thế nào. Khi chúng tôi đưa ra quyết định cuối cùng thì chúng tôi có thể sử dụng một cách thích hợp khi nào nên sử dụng self và khi nào nên sử dụng $this

Sự khác biệt giữa bản thân và tĩnh trong PHP là gì?

bản thân Vs tĩnh. Sự khác biệt cơ bản nhất giữa chúng là self trỏ đến phiên bản của thuộc tính của lớp mà nó được khai báo nhưng trong trường hợp tĩnh, thuộc tính sẽ được khai báo lại khi chạy.

Bản thân có giống với PHP này không?

Bản thân và đây là hai toán tử khác nhau được sử dụng để biểu thị lớp hiện tại và đối tượng hiện tại tương ứng. self được sử dụng để truy cập các biến hoặc phương thức tĩnh hoặc lớp và this được sử dụng để truy cập các biến hoặc phương thức không tĩnh hoặc đối tượng.

Sự khác biệt giữa cái này và tĩnh trong PHP là gì?

tĩnh. TEST có thể được sử dụng bên trong một phương thức tĩnh, trong khi $this. KIỂM TRA yêu cầu một phiên bản trước khi được sử dụng (vì vậy không thể sử dụng được trong các phương thức tĩnh).

Sự khác biệt giữa bản thân và tĩnh là gì?

Khi bạn sử dụng self trong lớp Foo để chỉ thuộc tính, bạn đang tham chiếu đến cùng một lớp. Khi bạn gọi một phương thức qua static , bạn đang gọi một tính năng gọi là liên kết tĩnh muộn (được giới thiệu trong PHP 5. 3). Trong trường hợp trên, sử dụng self sẽ dẫn đến Foo. thanh $ (1234).