Hướng dẫn php call parent method - php gọi phương thức cha

5

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Lấy ví dụ sau:

class A implements Serializable {
    serialize() {}
}
class B extends A {
    serialize() {}
}

Lớp A là một lớp dai dẳng nhưng tối thiểu được sử dụng trên mỗi trang. Lớp B chỉ là Quản trị viên tạm thời (được sử dụng trên màn hình Cài đặt), nơi điền vào các thành viên bằng cách đọc các tệp.

Tôi cần tuần tự hóa đối tượng và lưu trữ trong cơ sở dữ liệu hai lần, một lần cho các trang thông thường và thứ hai (với tuổi thọ hạn chế) cho trang quản trị viên.

$instance = new B(); // and populate
$data = serialize( $instance );

Điều này sẽ luôn gọi phương thức quá mức. Có cách nào tôi có thể sử dụng $instance để nhập A để tôi có thể gọi trên phương thức tuần tự hóa của ____ 5 không?

Hỏi ngày 14 tháng 12 năm 2013 lúc 14:53Dec 14, 2013 at 14:53

Hướng dẫn php call parent method - php gọi phương thức cha

7

Có thể bằng cách tạo một đóng cửa, trông theo đoạn trích để trình diễn

bindTo($b, 'B');
$closure(); // Say hello from A
$b->hello(); // Say hello from B

Đã trả lời ngày 11 tháng 12 năm 2018 lúc 8:27Dec 11, 2018 at 8:27

GasolgasolGasol

2.03915 Huy hiệu bạc23 Huy hiệu đồng15 silver badges23 bronze badges

Câu trả lời là không, bạn không thể. Trẻ em tái cấu trúc chức năng cha của phương pháp và hoàn toàn ghi đè nó. Đối với điều này, các phương pháp tĩnh sẽ được yêu cầu.

Đã trả lời ngày 14 tháng 12 năm 2013 lúc 14:55Dec 14, 2013 at 14:55

PraveenpraveenPraveen

2.3603 Huy hiệu vàng22 Huy hiệu bạc29 Huy hiệu đồng3 gold badges22 silver badges29 bronze badges

1

Jonathon Hibbard ¶

12 năm trước(mixed ...$values = ""): void

Bolshun tại Mail Dot Ru ¶

David tại Synatree Dot Com ¶: 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).

ziggy khi bắt đầu chấm bụi ¶

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();
?>

2 tháng trước đây

Reza Mahjourian ¶

16 năm trước

$instance = new B(); // and populate
$data = serialize( $instance );
0

$instance = new B(); // and populate
$data = serialize( $instance );
1

$instance = new B(); // and populate
$data = serialize( $instance );
2

instatiendaweb tại gmail dot com ¶

1 năm trước

Người xây dựng

$instance = new B(); // and populate
$data = serialize( $instance );
3 error but still call that function as a constructor. If both __construct() and a same-name method are defined, __construct() will be called.

__construct (hỗn hợp ...$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ư).

Ví dụ số 1 người xây dựng trong kế thừadefine() now.

Ghi chú::

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.

$instance = new B(); // and populate
$data = serialize( $instance );
4

$instance = new B(); // and populate
$data = serialize( $instance );
5

$instance = new B(); // and populate
$data = serialize( $instance );
6

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

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ũ

$instance = new B(); // and populate
$data = serialize( $instance );
7

$instance = new B(); // and populate
$data = serialize( $instance );
8

$instance = new B(); // and populate
$data = serialize( $instance );
9

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

$instance = new B(); // and populate
$data = serialize( $instance );
3 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.

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.

  • bindTo($b, 'B');
    $closure(); // Say hello from A
    $b->hello(); // Say hello from B
    
    0 có 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ả.
  • bindTo($b, 'B');
    $closure(); // Say hello from A
    $b->hello(); // Say hello from B
    
    1 chấp nhận 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.
  • bindTo($b, 'B');
    $closure(); // Say hello from A
    $b->hello(); // Say hello from B
    
    2 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

bindTo($b, 'B');
$closure(); // Say hello from A
$b->hello(); // Say hello from B
3 được dịch thành tên của lớp, mã được sử dụng. Trong trường hợp này là
bindTo($b, 'B');
$closure(); // Say hello from A
$b->hello(); // Say hello from B
4.

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

bindTo($b, 'B');
$closure(); // Say hello from A
$b->hello(); // Say hello from B
5

bindTo($b, 'B');
$closure(); // Say hello from A
$b->hello(); // Say hello from B
6

bindTo($b, 'B');
$closure(); // Say hello from A
$b->hello(); // Say hello from B
7

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 ¶

bindTo($b, 'B');
$closure(); // Say hello from A
$b->hello(); // Say hello from B
8

bindTo($b, 'B');
$closure(); // Say hello from A
$b->hello(); // Say hello from B
9

$instance0

$instance1

$instance2

11 năm trước

mmulej tại gmail dot com ¶

$instance3

$instance4

$instance5

$instance6

$instance7

$instance8

7 tháng trước

Domger tại Freenet Dot de ¶

$instance9

A0

A1

A2

$instance8

5 năm trước

IWWP tại Outlook Dot Com ¶

A4

A5

A6

A7

A8

A9

class A0

$instance8

2 năm trước

lách ¶

class A2

class A3

class A4

class A5

class A6

class A7

class A8

class A9

...$values0

$instance8

14 năm trước

prieler tại ABM Dot tại ¶

...$values2

...$values3

...$values4

...$values5

15 năm trước

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

...$values6

...$values7

...$values8

9 năm trước

Mỗi Persson ¶

...$values9

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

10 năm trước

Jonathon Hibbard ¶

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

12 năm trước

lách ¶

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

14 năm trước

lách ¶

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

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

class0

class1

class2

class3

...$values7

class5

class6

class7

class8

class9

$instance8

14 năm trước

prieler tại ABM Dot tại ¶

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

$instance8

15 năm trước

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

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

$instance = new B(); // and populate
$data = serialize( $instance );
00

9 năm trước

Mỗi Persson ¶

$instance = new B(); // and populate
$data = serialize( $instance );
01

$instance = new B(); // and populate
$data = serialize( $instance );
02

$instance = new B(); // and populate
$data = serialize( $instance );
03

$instance = new B(); // and populate
$data = serialize( $instance );
04

$instance = new B(); // and populate
$data = serialize( $instance );
05

$instance = new B(); // and populate
$data = serialize( $instance );
06

$instance = new B(); // and populate
$data = serialize( $instance );
07

$instance = new B(); // and populate
$data = serialize( $instance );
08

$instance8