Từ khóa private và final trong PHP
PHP
74
White

Hari Won viết ngày 11/08/2015

Private function trùng tên trong class cha - con

Bản thân rất hay quên nên mình memo lại đây

<?php
class A {
    private function whoami() {
        echo 'A', PHP_EOL;
    }

    public function out() {
        $this->whoami();
    }
}

class B extends A {
    private function whoami() {
        echo 'B', PHP_EOL;
    }
}

$a = new A;
$a->out();
$b = new B;
$b->out();

Khi chạy đoạn code này sẽ không hề có lỗi, mặc dù A và B là 2 class có 2 private function cùng tên là whoami. Kết quả sẽ trả lại 2 lần A, điều đó có nghĩa là $b->out(); gọi đến out() bên trong A, từ đó gọi đến whoami() bên trong A. Bây giờ mình sẽ thay đổi một chút

<?php
class A {
    private function whoami() {
        echo 'A', PHP_EOL;
    }

    public function out() {
        $this->whoami();
    }
}

class B extends A {
    private function whoami() {
        echo 'B', PHP_EOL;
    }

    public function out() {
        $this->whoami();
    }
}

$a = new A;
$a->out();
$b = new B;
$b->out();

Bây giờ kết quả sẽ là 1 lần A và 1 lần B. $b->out(); gọi đến out() bên trong B và lại gọi đến whoami() bên trong B. Như vậy có thể hiểu, với private function thì các class extend không nhìn thấy và không được coi là định nghĩa đè.

Ngăn cản trường hợp trùng tên

Để ngăn cản trường hợp trên, với mục địch cho code dễ đọc và dễ maintain hơn thì mình hay dùng từ khóa final

<?php
class A {
    final private function whoami() {
        echo 'A', PHP_EOL;
    }
}

class B extends A {
    private function whoami() {
        echo 'B', PHP_EOL;
    }
}

Đoạn trên đây khi chạy sẽ bắn ra lỗi và bắt buộc mình phải sửa tên hàm ngay.

PHP Fatal error:  Cannot override final method A::whoami() in /tmp/test.php on line 12
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Hari Won

2 bài viết.
0 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
3 4
Kể từ PHP 5.4, ta đã có thể dùng PHP Trait. Mình vẫn hay dùng PHP Trait để bắt buộc các lớp trờ thành singleton như thế này PHP hello()); $test ...
Hari Won viết hơn 2 năm trước
3 4
Bài viết liên quan
White
2 2
Bash script to fast serve Laravel project Lười gõ dòng lệnh quá nên tạo ra cái script để gõ nhanh :D laravelstart.sh /bin/bash if z "$1" ] ...
Vũ Hoàng Chung viết 11 tháng trước
2 2
Male avatar
9 1
Để bắt đầu làm thêm của riêng bạn thì ban đầu bạn phải có một theme trắng ( Blank theme ) để bắt đầu Theme trắng là gồm có các thư mục và file cơ b...
Doan Van Manh viết hơn 2 năm trước
9 1
Male avatar
0 0
Một ngày nào đó, bạn mới dựng source code lên. Bạn luôn hi vọng khi vào site sẽ hiển thị đẹp mắt và yếu tố đẹp mắt ban đầu sẽ là text của site của ...
skul169 viết hơn 1 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
2 bài viết.
0 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!