Làm cách nào tôi có thể truy cập phương thức lớp trong PHP?

Chúng ta có thể truy cập các thuộc tính [biến] và phương thức [hàm] của các lớp khác bằng cách đưa đối tượng lớp vào lớp cần nó

2786 lượt xem

Bởi. Jacob

Đã chỉnh sửa. 2020-09-06 10. 02

Trong PHP hướng đối tượng [OOP], đôi khi có thể muốn truy cập các phương thức từ các lớp khác, Trong bài viết này, chúng ta sẽ thảo luận về hai cách để giải quyết vấn đề này

Vấn đề. Một vấn đề phổ biến dành cho người mới bắt đầu trong OOP là làm thế nào để truy cập các thuộc tính [biến] và phương thức [hàm] từ các lớp khác mà không mở rộng chúng. Chúng tôi thực sự có một số cách để giải quyết vấn đề này. Giải pháp đầu tiên và được khuyến nghị là sử dụng một kỹ thuật có tên là Dependency injection [DI], kỹ thuật này cho phép chúng tôi chia nhỏ mã của mình và tổ chức mã trong các lớp riêng biệt, sau đó có thể khởi tạo độc lập

Xem thêm. Một lớp học lớn so với nhiều lớp học

Khi sử dụng DI, chúng ta thường sẽ khởi tạo một lớp một lần trong thư mục gốc của thành phần [I. e. mục lục. php], rồi chuyển nó cho các lớp tiếp theo phụ thuộc vào nó. Dưới đây là một ví dụ về cách kỹ thuật này có thể được sử dụng

$db = new db_client[];
$handle_users = new handle_users[$db];

Trong ví dụ này, db_client[] là một lớp độc lập được chia sẻ bởi hai hoặc nhiều đối tượng. Không nên kéo dài. Thay vì mở rộng nó, chúng tôi đưa nó vào các lớp cần truy cập cơ sở dữ liệu

Bên trong handle_users[], đối tượng cơ sở dữ liệu sẽ có sẵn trong phương thức ma thuật __construct[]

class handle_users {
  private $db;

  public function __construct[$db]{
   $this->db = $db;
  }
   
   public function login_check[] {
    //  $db->query[''];
    // ...
   }
}

Tiêm phụ thuộc trong OOP

Một cách được đề xuất để làm cho một lớp phụ thuộc vào lớp khác, là sử dụng phép nội xạ hàm tạo. Giải pháp mà chúng ta thảo luận trong phần này sẽ hiệu quả trong hầu hết các trường hợp. Chúng ta hãy bắt đầu bằng cách tưởng tượng một lớp độc lập được chia sẻ bởi nhiều đối tượng

class db_client {
  public $db_link;

  private $db_host = "localhost";
  private $db_user = "Username";
  private $db_pw = "Password";
  private $db_name = "Database";

  public function __construct[] {
    $this->db_link = @new mysqli[$this->db_host, $this->db_user, $this->db_pw, $this->db_name];
  }
}

Hãy coi lớp db_client[] như một ứng dụng khách để xử lý tất cả nội dung cơ sở dữ liệu. Vì nó có thể được chia sẻ bởi nhiều dự án hoặc đối tượng khác nhau, chúng ta nên cố gắng biến nó thành một lớp độc lập

Chúng ta không nên mở rộng db_client từ lớp handle_users, vì nó sẽ làm cho nó kết hợp quá chặt chẽ với mã người dùng và làm hỏng tính di động của lớp db_client[]. Thay vào đó, chúng ta nên sử dụng DI để cung cấp đối tượng cơ sở dữ liệu dưới dạng phụ thuộc cho lớp trình xử lý người dùng khi khởi tạo

Bây giờ, hãy tưởng tượng chúng ta cũng tạo một lớp handle_users xử lý mọi thứ liên quan đến người dùng, chẳng hạn như tạo người dùng mới, đăng nhập và đăng xuất, v.v. Lớp handle_users cần db_client[]; . Để làm điều này, chúng ta có thể chuyển db_client làm tham số khi khởi tạo lớp handle_users

class handle_users {
  public $db;
    
  public function __construct[$db] {
    $this->db = $db; // Make $db available via "$this->db->your_function[]"
  }
  public function  {
    $this->db->db_link->query['SELECT * FROM....']; // The db_client object used inside handle_users.
  }
}

Để điều này hoạt động, trước tiên chúng ta cần tạo một thể hiện của lớp db_client, sau đó chuyển nó dưới dạng tham số khi tải lớp handle_users. Tôi. e

require $_SERVER["DOCUMENT_ROOT"] . 'db_class.php'; // Handles the Database stuff
require $_SERVER["DOCUMENT_ROOT"] . 'handle_users.php'; // All user related stuff

$db = new db_client[];
$handle_users = new handle_users[$db];

__xây dựng[]; . Đối tượng $db tự động có sẵn bên trong phương thức __construct nơi chúng ta có thể gán nó cho một thuộc tính [biến]

Sử dụng singleton trong PHP

Một cách khác để truy cập các phương thức trong một lớp khác là sử dụng singleton. Điều này cho phép sử dụng các phương thức mà không cần khởi tạo lớp trước. Thay vào đó, đối tượng được tạo bên trong chính lớp đó

Ghi chú. Sử dụng singleton trong PHP không được khuyến khích

Một lớp cơ sở dữ liệu trong singleton trông như thế này

class db_client {
  private static $instance = null;

  // Credentials
  private $db_host = "localhost";
  private $db_user = "Username";
  private $db_pw = "Password";
  private $db_name = "Database";

  public static function getInstance[] {
    if [self::$instance == null] {
      self::$instance = new Singleton[];
    }
    return self::$instance;
  }
  public function getConnection[] {
  	return $this->db_link;
  }

  private function __construct[] {
    $this->db_link = @new mysqli[$this->db_host, $this->db_user, $this->db_pw, $this->db_name];
  }
}

Để thực hiện một truy vấn cơ sở dữ liệu, chỉ cần làm như thế này

$db = db_client::getInstance[];
$mysqli = $db->getConnection[]; 
$result = $mysqli->query["SELECT foo FROM ....."];

Phương thức __construct[] được khai báo là private, ngăn việc tạo đối tượng từ bên ngoài lớp bằng toán tử new. Thay vào đó, đối tượng được tạo từ bên trong phương thức getInstance[]

Làm cách nào để truy cập biến phương thức lớp trong PHP?

Bạn đang truy cập một biến trong lớp. Trong lớp bạn gọi các phương thức và biến như vậy. $this->myMethod[] và $this->myVar . Bên ngoài Lớp gọi phương thức và var như vậy $test->myMethod[] và $test->myVar. Lưu ý rằng cả phương thức và biến đều có thể được định nghĩa là Riêng tư hoặc Công khai.

Làm cách nào để gọi một phương thức lớp trong PHP?

Khi gọi hằng số lớp bằng cách sử dụng $classname. hằng số cú pháp, tên lớp thực sự có thể là một biến. Kể từ PHP 5. 3, bạn có thể truy cập hằng số lớp tĩnh bằng tham chiếu biến [Ví dụ. tên lớp. $varConstant].

Phương thức lớp được định nghĩa như thế nào trong PHP?

Cú pháp. Chúng tôi xác định lớp của riêng mình bằng cách bắt đầu bằng từ khóa 'lớp' theo sau là tên bạn muốn đặt cho lớp mới của mình . ? . Chúng tôi bao quanh một lớp bằng cách sử dụng dấu ngoặc nhọn [ { } ]… giống như bạn làm với các hàm.

Chủ Đề