Hướng dẫn how do you initialize a class in php? - làm thế nào để bạn khởi tạo một lớp trong php?

Điều gì sẽ là một cách tốt (cùng với bất kỳ ưu và nhược điểm nào) của việc khởi tạo một thể hiện của một lớp PHP với một đối tượng khác của cùng một lớp (lý tưởng trong PHP 4.x)?

Ở đây trong initialize() về cơ bản là những gì tôi muốn làm (ví dụ cực kỳ đơn giản từ trường hợp sử dụng của tôi, xem bên dưới):

$product = new Product('Widget');
$product2 = new Product('Widget #2');
$product->initialize($product2);
echo $product->name;  // echos "Widget #2"

class Product {
 var $name;
 function __constructor($name) {
   $this->name = $name;
 }
 function initialize($product) {
   // I know this cannot be done this way in PHP. 
   // What are the alternatives and their pros & cons?
   $this = $product;  
 }
}

Tôi biết điều này có thể không phải là "thực hành lập trình tốt"; Với hơn 20 năm kinh nghiệm lập trình trên các ngôn ngữ khác, tôi biết một chút về những gì tốt và những gì không. Vì vậy, hy vọng chúng ta sẽ không bị treo lên nếu làm điều này có ý nghĩa hay không. Tôi có một trường hợp sử dụng làm việc với một số mã nguồn mở mà tôi không thể thay đổi, vì vậy xin vui lòng chỉ cần chịu đựng tôi về nhu cầu của tôi. Tôi thực sự đang cố gắng tạo ra một trình bao bọc OOP xung quanh một số mã mảng thực sự xấu xí bị chôn sâu trong cốt lõi của WordPress.

Tôi đang cố gắng viết nó để trong các phiên bản trong tương lai, họ có thể rời khỏi mã dựa trên mảng xấu xí vì mọi người sẽ sử dụng API mới mà nếu không, gói gọn các mảng khó chịu này. Nhưng để làm cho nó hoạt động một cách thanh lịch, tôi cần có khả năng thực hiện những điều trên (trong PHP 4.x) và tôi không muốn viết mã chỉ sao chép các thuộc tính.

Cảm ơn trước sự giúp đỡ của bạn.

CẬP NHẬT

Nhiều bạn đang đề xuất clone nhưng trừ khi tôi hiểu sai điều đó không giải quyết được câu hỏi. clone tạo ra một bản sao; Đó không phải là mấu chốt của câu hỏi. Thay vào đó, tôi đang cố gắng đưa đối tượng được xây dựng để "trở thành" đối tượng được truyền vào. Tại thời điểm này, tôi cho rằng không có cách nào để làm điều đó dựa trên thực tế là 0 trên 5 câu trả lời đã gợi ý bất cứ điều gì nhưng tôi 'Tôi sẽ đợi lâu hơn một chút trước khi chọn tốt nhất trong trường hợp đơn giản là câu hỏi của tôi không rõ ràng.I'm instead trying to get the constructed object to "become" the object passed in. At this point I'm assuming there isn't a way to do that based on the fact that 0 out of 5 answers have suggested anything but I'll wait a bit longer before selecting a best in case it was simply that my questions was unclear.

Người xây dựng

__construct (hỗn hợp ...$values = ""): VOID(mixed ...$values = ""): void

PHP cho phép các nhà phát triển khai báo các phương thức xây dựng cho các lớp. Các lớp có phương thức xây dựng gọi phương thức này trên mỗi đối tượng mới được tạo, do đó, nó phù hợp với bất kỳ khởi tạo nào mà đối tượng có thể cần trước khi nó được sử dụng.

Lưu ý: Các hàm tạo cha mẹ không được gọi là ngầm nếu lớp con định nghĩa một hàm tạo. Để chạy một hàm tạo cha mẹ, một cuộc gọi đến cha mẹ :: __ construct () trong hàm tạo con là bắt buộc. Nếu trẻ không định nghĩa một hàm tạo thì nó có thể được kế thừa từ lớp cha giống như một phương thức lớp bình thường (nếu nó không được tuyên bố là riêng tư).: Parent constructors are not called implicitly if the child class defines a constructor. In order to run a parent constructor, a call to parent::__construct() within the child constructor is required. If the child does not define a constructor then it may be inherited from the parent class just like a normal class method (if it was not declared as private).

Ví dụ số 1 người xây dựng trong kế thừa

class BaseClass {
    function 
__construct() {
        print 
"In BaseClass constructor\n";
    }
}

class

SubClass extends BaseClass {
    function 
__construct() {
        
parent::__construct();
        print 
"In SubClass constructor\n";
    }
}

class

OtherSubClass extends BaseClass {
    
// inherits BaseClass's constructor
}// In BaseClass constructor
$obj = new BaseClass();// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();// In BaseClass constructor
$obj = new OtherSubClass();
?>

Không giống như các phương thức khác, __construct () được miễn trừ khỏi các quy tắc tương thích chữ ký thông thường khi được mở rộng.

Các hàm tạo là các phương pháp thông thường được gọi trong quá trình khởi tạo đối tượng tương ứng của chúng. Như vậy, chúng có thể xác định một số lượng đối số tùy ý, có thể được yêu cầu, có thể có một loại và có thể có giá trị mặc định. Các đối số của hàm tạo được gọi bằng cách đặt các đối số trong ngoặc đơn sau tên lớp.

Ví dụ #2 sử dụng các đối số của hàm tạo

class Point {
    protected 
int $x;
    protected 
int $y;

    public function

initialize()0

Nếu một lớp không có hàm tạo, hoặc hàm tạo không có đối số bắt buộc, dấu ngoặc đơn có thể bị bỏ qua.

Nhà xây dựng kiểu cũ

Trước Php 8.0.0, các lớp trong không gian tên toàn cầu sẽ diễn giải một phương pháp được đặt tên giống như lớp như một hàm tạo kiểu cũ. Cú pháp đó không được chấp nhận và sẽ dẫn đến lỗi initialize()1 nhưng vẫn gọi chức năng đó là một hàm tạo. Nếu cả __construct () và một phương thức cùng tên được xác định, __construct () sẽ được gọi.initialize()1 error but still call that function as a constructor. If both __construct() and a same-name method are defined, __construct() will be called.

Trong các lớp theo tên, hoặc bất kỳ lớp nào là của Php 8.0.0, một phương pháp có tên giống như lớp không bao giờ có bất kỳ ý nghĩa đặc biệt nào.

Luôn luôn sử dụng __construct () trong mã mới.

Mới trong khởi tạo

Kể từ Php 8.1.0, các đối tượng có thể được sử dụng làm giá trị tham số mặc định, các biến tĩnh và hằng số toàn cầu, cũng như trong các đối số thuộc tính. Các đối tượng cũng có thể được truyền để xác định () ngay bây giờ.define() now.

Ghi chú::

Việc sử dụng tên lớp động hoặc không chuỗi hoặc lớp ẩn danh không được phép. Việc sử dụng giải nén đối số không được phép. Việc sử dụng các biểu thức không được hỗ trợ làm đối số không được phép.

Ví dụ số 4 sử dụng mới trong bộ khởi tạo

initialize()2

initialize()3

initialize()4

Phương pháp tạo tĩnh

PHP chỉ hỗ trợ một hàm tạo đơn cho mỗi lớp. Tuy nhiên, trong một số trường hợp, có thể mong muốn cho phép một đối tượng được xây dựng theo những cách khác nhau với các đầu vào khác nhau. Cách được khuyến nghị để làm như vậy là bằng cách sử dụng các phương thức tĩnh làm trình bao gồm hàm tạo.

Ví dụ #5 sử dụng các phương thức tạo tĩnh

initialize()5

initialize()6

initialize()7

Chất xây dựng có thể được làm riêng hoặc được bảo vệ để ngăn chặn nó được gọi là bên ngoài. Nếu vậy, chỉ có một phương pháp tĩnh sẽ có thể khởi tạo lớp. Bởi vì chúng nằm trong cùng một định nghĩa lớp, họ có quyền truy cập vào các phương thức riêng tư, ngay cả khi không có cùng một thể hiện đối tượng. Hàm tạo riêng là tùy chọn và có thể hoặc không có ý nghĩa tùy thuộc vào trường hợp sử dụng.

Ba phương pháp tĩnh công khai sau đó chứng minh các cách khác nhau để khởi tạo đối tượng.

  • initialize()8 lấy các tham số chính xác cần thiết, sau đó tạo đối tượng bằng cách gọi hàm tạo và trả về kết quả.
  • initialize()9 chấp nhận một chuỗi JSON và thực hiện một số xử lý trước trên chính nó để chuyển đổi nó thành định dạng mong muốn của hàm tạo. Sau đó, nó trả về đối tượng mới.
  • clone0 chấp nhận chuỗi XML, tiền xử lý và sau đó tạo một đối tượng trần. Hàm tạo vẫn được gọi, nhưng vì tất cả các tham số là tùy chọn phương thức bỏ qua chúng. Sau đó, nó gán các giá trị cho các thuộc tính đối tượng trực tiếp trước khi trả về kết quả.

Trong cả ba trường hợp, từ khóa clone1 được dịch thành tên của lớp, mã được sử dụng. Trong trường hợp này là clone2.

Người phá hủy

__destruct (): Void(): void

PHP sở hữu một khái niệm phá hủy tương tự như các ngôn ngữ hướng đối tượng khác, chẳng hạn như C ++. Phương pháp phá hủy sẽ được gọi ngay khi không có tài liệu tham khảo nào khác đến một đối tượng cụ thể hoặc theo bất kỳ thứ tự nào trong chuỗi tắt.

Ví dụ #6 Ví dụ về Destruction

clone3

clone4

clone5

Giống như các nhà xây dựng, các hàm hủy của cha mẹ sẽ không được gọi là ngầm bởi động cơ. Để chạy một kẻ hủy diệt cha mẹ, người ta sẽ phải gọi rõ ràng cha mẹ :: __ sestruct () trong cơ thể phá hủy. Cũng giống như các nhà xây dựng, một lớp con có thể thừa hưởng chất hủy diệt của cha mẹ nếu nó không tự thực hiện một.parent::__destruct() in the destructor body. Also like constructors, a child class may inherit the parent's destructor if it does not implement one itself.

Bộ hủy sẽ được gọi ngay cả khi việc thực thi tập lệnh được dừng bằng EXIT (). Gọi EXIT () trong một bộ hủy sẽ ngăn các thói quen tắt còn lại thực thi.exit(). Calling exit() in a destructor will prevent the remaining shutdown routines from executing.

Ghi chú::

Destructor được gọi trong quá trình tắt kịch bản đã được gửi tiêu đề HTTP. Thư mục làm việc trong giai đoạn tắt tập lệnh có thể khác với một số SAPIs (ví dụ: Apache).

Ghi chú::

Destructor được gọi trong quá trình tắt kịch bản đã được gửi tiêu đề HTTP. Thư mục làm việc trong giai đoạn tắt tập lệnh có thể khác với một số SAPIs (ví dụ: Apache).

Cố gắng ném một ngoại lệ từ một kẻ phá hủy (được gọi trong thời gian chấm dứt kịch bản) gây ra lỗi nghiêm trọng.

David Dot Scourfield tại Llynfi Dot Co Dot Uk ¶

clone6

clone7

clone8

clone9

clone0

11 năm trước

mmulej tại gmail dot com ¶

clone1

clone2

clone3

clone4

clone5

clone6

7 tháng trước

Domger tại Freenet Dot de ¶

clone7

clone8

clone9

...$values0

clone6

5 năm trước

IWWP tại Outlook Dot Com ¶

...$values2

...$values3

...$values4

...$values5

...$values6

...$values7

...$values8

clone6

2 năm trước

lách ¶

class BaseClass {
    function 
__construct() {
        print 
"In BaseClass constructor\n";
    }
}
0

class BaseClass {
    function 
__construct() {
        print 
"In BaseClass constructor\n";
    }
}
1

class BaseClass {
    function 
__construct() {
        print 
"In BaseClass constructor\n";
    }
}
2

class BaseClass {
    function 
__construct() {
        print 
"In BaseClass constructor\n";
    }
}
3

class BaseClass {
    function 
__construct() {
        print 
"In BaseClass constructor\n";
    }
}
4

class BaseClass {
    function 
__construct() {
        print 
"In BaseClass constructor\n";
    }
}
5

class BaseClass {
    function 
__construct() {
        print 
"In BaseClass constructor\n";
    }
}
6

class BaseClass {
    function 
__construct() {
        print 
"In BaseClass constructor\n";
    }
}
7

class BaseClass {
    function 
__construct() {
        print 
"In BaseClass constructor\n";
    }
}
8

clone6

14 năm trước

prieler tại ABM Dot tại ¶

class0

class1

class2

class3

15 năm trước

Yousef Ismaeil cliprz [at] gmail [dot] com ¶

class4

class5

class6

9 năm trước

Mỗi Persson ¶

class7

class8

class9

SubClass extends BaseClass {
    function 
__construct() {
        
parent::__construct();
        print 
"In SubClass constructor\n";
    }
}

class

OtherSubClass extends BaseClass {
    
// inherits BaseClass's constructor
}// In BaseClass constructor
$obj = new BaseClass();// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();// In BaseClass constructor
$obj = new OtherSubClass();
?>
0

10 năm trước

Jonathon Hibbard ¶

SubClass extends BaseClass {
    function 
__construct() {
        
parent::__construct();
        print 
"In SubClass constructor\n";
    }
}

class

OtherSubClass extends BaseClass {
    
// inherits BaseClass's constructor
}// In BaseClass constructor
$obj = new BaseClass();// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();// In BaseClass constructor
$obj = new OtherSubClass();
?>
1

SubClass extends BaseClass {
    function 
__construct() {
        
parent::__construct();
        print 
"In SubClass constructor\n";
    }
}

class

OtherSubClass extends BaseClass {
    
// inherits BaseClass's constructor
}// In BaseClass constructor
$obj = new BaseClass();// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();// In BaseClass constructor
$obj = new OtherSubClass();
?>
2

SubClass extends BaseClass {
    function 
__construct() {
        
parent::__construct();
        print 
"In SubClass constructor\n";
    }
}

class

OtherSubClass extends BaseClass {
    
// inherits BaseClass's constructor
}// In BaseClass constructor
$obj = new BaseClass();// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();// In BaseClass constructor
$obj = new OtherSubClass();
?>
3

SubClass extends BaseClass {
    function 
__construct() {
        
parent::__construct();
        print 
"In SubClass constructor\n";
    }
}

class

OtherSubClass extends BaseClass {
    
// inherits BaseClass's constructor
}// In BaseClass constructor
$obj = new BaseClass();// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();// In BaseClass constructor
$obj = new OtherSubClass();
?>
4

12 năm trước

lách ¶

SubClass extends BaseClass {
    function 
__construct() {
        
parent::__construct();
        print 
"In SubClass constructor\n";
    }
}

class

OtherSubClass extends BaseClass {
    
// inherits BaseClass's constructor
}// In BaseClass constructor
$obj = new BaseClass();// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();// In BaseClass constructor
$obj = new OtherSubClass();
?>
5

14 năm trước

lách ¶

SubClass extends BaseClass {
    function 
__construct() {
        
parent::__construct();
        print 
"In SubClass constructor\n";
    }
}

class

OtherSubClass extends BaseClass {
    
// inherits BaseClass's constructor
}// In BaseClass constructor
$obj = new BaseClass();// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();// In BaseClass constructor
$obj = new OtherSubClass();
?>
6

SubClass extends BaseClass {
    function 
__construct() {
        
parent::__construct();
        print 
"In SubClass constructor\n";
    }
}

class

OtherSubClass extends BaseClass {
    
// inherits BaseClass's constructor
}// In BaseClass constructor
$obj = new BaseClass();// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();// In BaseClass constructor
$obj = new OtherSubClass();
?>
7

SubClass extends BaseClass {
    function 
__construct() {
        
parent::__construct();
        print 
"In SubClass constructor\n";
    }
}

class

OtherSubClass extends BaseClass {
    
// inherits BaseClass's constructor
}// In BaseClass constructor
$obj = new BaseClass();// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();// In BaseClass constructor
$obj = new OtherSubClass();
?>
8

SubClass extends BaseClass {
    function 
__construct() {
        
parent::__construct();
        print 
"In SubClass constructor\n";
    }
}

class

OtherSubClass extends BaseClass {
    
// inherits BaseClass's constructor
}// In BaseClass constructor
$obj = new BaseClass();// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();// In BaseClass constructor
$obj = new OtherSubClass();
?>
9

class Point {
    protected 
int $x;
    protected 
int $y;
0

class Point {
    protected 
int $x;
    protected 
int $y;
1

class5

class Point {
    protected 
int $x;
    protected 
int $y;
3

class Point {
    protected 
int $x;
    protected 
int $y;
4

class Point {
    protected 
int $x;
    protected 
int $y;
5

class Point {
    protected 
int $x;
    protected 
int $y;
6

class Point {
    protected 
int $x;
    protected 
int $y;
7

clone6

14 năm trước

prieler tại ABM Dot tại ¶

class Point {
    protected 
int $x;
    protected 
int $y;
9

    public function0

    public function1

    public function2

clone6

15 năm trước

Yousef Ismaeil cliprz [at] gmail [dot] com ¶

    public function4

    public function5

    public function6

    public function7

    public function8

9 năm trước

Mỗi Persson ¶

    public function9

initialize()00

initialize()01

initialize()02

initialize()03

initialize()04

initialize()05

initialize()06

clone6

Làm thế nào để bạn khởi tạo một lớp?

Có hai cách để khởi tạo một đối tượng lớp: sử dụng danh sách biểu thức dấu ngoặc đơn. Trình biên dịch gọi hàm tạo của lớp bằng danh sách này làm danh sách đối số của trình xây dựng. Sử dụng một giá trị khởi tạo duy nhất và toán tử =.Using a parenthesized expression list. The compiler calls the constructor of the class using this list as the constructor's argument list. Using a single initialization value and the = operator.

Cách chính xác để bắt đầu lớp PHP là gì?

Các định nghĩa lớp cơ bản bắt đầu bằng lớp từ khóa, theo sau là tên lớp, theo sau là một cặp niềng răng xoăn bao quanh các định nghĩa của các thuộc tính và phương thức thuộc lớp.Tên lớp có thể là bất kỳ nhãn hợp lệ nào, miễn là nó không phải là từ dành riêng của PHP.begin with the keyword class , followed by a class name, followed by a pair of curly braces which enclose the definitions of the properties and methods belonging to the class. The class name can be any valid label, provided it is not a PHP reserved word.

Bạn có thể tạo một lớp trong PHP không?

Các lớp học không có gì nếu không có đối tượng!Chúng ta có thể tạo nhiều đối tượng từ một lớp.Mỗi đối tượng có tất cả các thuộc tính và phương thức được xác định trong lớp, nhưng chúng sẽ có các giá trị thuộc tính khác nhau.Đối tượng của một lớp được tạo bằng cách sử dụng từ khóa mới.We can create multiple objects from a class. Each object has all the properties and methods defined in the class, but they will have different property values. Objects of a class is created using the new keyword.

Bạn có thể khởi tạo các giá trị trong một lớp không?

Để khởi tạo một biến thành viên lớp, hãy đặt mã khởi tạo trong một khối khởi tạo tĩnh, như phần sau đây cho thấy.Để khởi tạo một biến thành viên thể hiện, hãy đặt mã khởi tạo vào hàm tạo., as the following section shows. To initialize an instance member variable, put the initialization code in a constructor.