Hướng dẫn what is return of the constructor in php? - Trả về của hàm tạo trong php là gì?

Bạn có thể làm bất cứ điều gì bạn muốn với giá trị trả về của hàm tạo, vì vậy không phải là "không có gì có thể được thực hiện với giá trị trả về của hàm tạo (ngoài việc sử dụng đối tượng mà nó tạo)." Giá trị trả về của hàm tạo không phải là đối tượng "nó" được tạo. Trình xây dựng không tạo các đối tượng (từ khóa new không). Giá trị trả về của hàm tạo giống như của bất kỳ chức năng nào khác: bất cứ điều gì bạn chọn để trả về. Hơn nữa, cũng sai khi một đối tượng đã phải tồn tại để gọi hàm tạo của nó. Điều này hoàn toàn hợp lệ:

$parent_constructor_return_value = parent::__construct();

Ví dụ:

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."

Mặc dù điều này là có thể, tôi không thể hình dung ra một kịch bản trong đó nó sẽ là thực hành tốt nhất. Rốt cuộc, bạn luôn có thể gọi một phương thức khác với parent::__construct() để có được giá trị của bạn và tất cả những gì bạn mất là tối nghĩa. Tôi cho rằng nó có thể được sử dụng như một cách xử lý lỗi-có hai cách khác để thực hiện cùng một điều:

  1. Ném các ngoại lệ trong hàm tạo cha mẹ và bắt chúng trong hàm tạo dẫn xuất của bạn.
  2. Đặt các thuộc tính trong hàm tạo cha mẹ chỉ ra rằng xảy ra lỗi, và sau đó kiểm tra trạng thái của các thuộc tính đó trong hàm tạo dẫn xuất.

Nếu một lỗi trong trình xây dựng cha không phải là đặc biệt, anh ta có thể đã quyết định có các giá trị lỗi trả về hàm tạo cha mẹ, thay vì lưu trữ thông tin lỗi thoáng qua dưới dạng thuộc tính đối tượng. Tất nhiên, sau đó lý do duy nhất để đặt tên cho phương pháp của cha mẹ __construct là nếu lớp cha không trừu tượng nhưng bản thân nó có thể được khởi tạo-nhưng trong bối cảnh đó, các thông báo lỗi đã trả lại sẽ không bao giờ được nhìn thấy. Vì vậy, mô hình xấu; xấu. Các hàm tạo không có ý định trả lại các giá trị, điều đó có nghĩa là bạn đang mở một loại giun kiến ​​trúc bằng cách tận dụng cơ chế này.

16 năm trước

instatiendaweb tại gmail dot com ¶(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

<?php
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

<?php
class Point {
    protected 
int $x;
    protected 
int $y;

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
0

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
1

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

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
2 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.
abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
2
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

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
3

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
4

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
5

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

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
6

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
7

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
8

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.

  • abstract class MyBase {
        function __construct () {
            return "Hello, world.";
        }
    }
    class MyDerived extends MyBase {
        function __construct () {
            echo parent::__construct();
        }
    }
    new MyDerived(); // prints "Hello, world."
    
    9 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ả.
  • new0 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.
  • new1 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 new2 được dịch thành tên của lớp, mã được sử dụng. Trong trường hợp này, new3.

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

new4

new5

new6

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ú::

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 ¶

11 năm trước

new7

new8

new9

parent::__construct()0

parent::__construct()1

mmulej tại gmail dot com ¶

7 tháng trước

parent::__construct()2

parent::__construct()3

parent::__construct()4

parent::__construct()5

parent::__construct()6

parent::__construct()7

Domger tại Freenet Dot de ¶

5 năm trước

parent::__construct()8

parent::__construct()9

__construct0

__construct1

parent::__construct()7

IWWP tại Outlook Dot Com ¶

2 năm trước

__construct3

__construct4

__construct5

__construct6

__construct7

__construct8

__construct9

parent::__construct()7

lách ¶

14 năm trước

...$values1

...$values2

...$values3

...$values4

...$values5

...$values6

...$values7

...$values8

...$values9

parent::__construct()7

prieler tại ABM Dot tại ¶

15 năm trước

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

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

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

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

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

9 năm trước

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

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

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

Mỗi Persson ¶

10 năm trước

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

<?php
class BaseClass {
    function 
__construct() {
        print 
"In BaseClass constructor\n";
    }
}
9

class0

class1

Jonathon Hibbard ¶

12 năm trước

class2

class3

class4

class5

Bolshun tại Mail Dot Ru ¶

14 năm trước

class6

prieler tại ABM Dot tại ¶

14 năm trước

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

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

<?php
class BaseClass {
    function 
__construct() {
        print 
"In BaseClass constructor\n";
    }
}
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();
?>
4

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

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

parent::__construct()7

prieler tại ABM Dot tại ¶

15 năm trước

<?php
class Point {
    protected 
int $x;
    protected 
int $y;
0

<?php
class Point {
    protected 
int $x;
    protected 
int $y;
1

<?php
class Point {
    protected 
int $x;
    protected 
int $y;
2

<?php
class Point {
    protected 
int $x;
    protected 
int $y;
3

parent::__construct()7

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

9 năm trước

<?php
class Point {
    protected 
int $x;
    protected 
int $y;
5

<?php
class Point {
    protected 
int $x;
    protected 
int $y;
6

<?php
class Point {
    protected 
int $x;
    protected 
int $y;
7

<?php
class Point {
    protected 
int $x;
    protected 
int $y;
8

<?php
class Point {
    protected 
int $x;
    protected 
int $y;
9

Mỗi Persson ¶

10 năm trước

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
00

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
01

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
02

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
03

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
04

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
05

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
06

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."
07

parent::__construct()7

Chúng ta có thể trở lại từ người xây dựng PHP không?

Một hàm tạo không trả về không có gì, nhưng bạn có thể quay lại từ nó (dừng thực thi phương thức tại một điểm vì một số lý do nhưng đối tượng có thể được tạo).you can return from it (stopping the method execution at a point for some reason but the object can be created).

Câu lệnh trả về của một hàm tạo là gì?

Các hàm tạo không trả về bất kỳ loại nào trong khi (các) phương thức có loại trả về hoặc void nếu không trả về bất kỳ giá trị nào. while method(s) have the return type or void if does not return any value.

Trả lại $ cái này trong PHP?

$ Điều này có nghĩa là đối tượng hiện tại, phương thức hiện đang được chạy.Bằng cách trả về $ đây, một tham chiếu đến đối tượng, phương thức đang hoạt động được gửi lại cho chức năng gọi.a reference to the object the method is working gets sent back to the calling function.

Các nhà xây dựng có thể trở lại?

Một hàm tạo không thể trả về một giá trị vì một hàm tạo hoàn toàn trả về ID tham chiếu của một đối tượng và vì một hàm tạo cũng là một phương thức và một phương thức không thể trả về nhiều hơn một giá trị. because a constructor implicitly returns the reference ID of an object, and since a constructor is also a method and a method can't return more than one values.