Php mình

PHP chạy trên môi trường WebServer và lưu trữ thông tin dữ liệu thông qua hệ thống quản trị cơ sở dữ liệu nên PHP thường đi kèm với Apache, MySQL và hệ điều hành Linux (LAMP)

  • Apache là một máy chủ web phần mềm có nhiệm vụ tiếp nhận yêu cầu từ trình duyệt người dùng sau đó chuyển giao cho PHP xử lý và gửi trả lại cho trình duyệt
  • MySQL tương tự như các hệ thống quản trị cơ sở dữ liệu khác (PostgreSQL, Oracle, SQL Server…) đóng vai trò là nơi lưu trữ và truy vấn dữ liệu
  • Linux. Hệ điều hành nguồn mở được sử dụng rất rộng rãi mã cho các WebServer. Thông thường các phiên bản được sử dụng nhiều nhất là RedHat Enterprise Linux, Ubuntu…

PHP hoạt động như thế nào?

Khi người sử dụng gọi trang PHP, Web Server sẽ gọi PHP Engine để thông dịch trang PHP và trả kết quả cho người dùng như hình bên dưới

Php mình
Php mình

Các bước cài đặt Web server

Bước 1. Tải xuống XAMPP tại https. //www. apachefriends. tổ chức/tải xuống. html và tiến trình cài đặt như các chương trình thông thường

Bước 2. Kích vào nút Start Apache và MySQL trên cửa sổ  XAMPP Control Panel

Php mình
Php mình

Bước 3. Mở trình duyệt (IE, FireFox hoặc Chrome), rồi nhập vào thanh địa chỉ trình duyệt localhost. Nếu màn hình hiện ra thì việc cài đặt đã thành công

Php mình
Php mình

Bước 4. Truy cập thư mục cài đặt XAMPP/htdocs và tạo tệp cài đặt là test. php with the content as after




Gõ trên duyệt địa chỉ localhost/test. php. Nếu hiện ra dòng chữ Hello World có nghĩa là ứng dụng PHP đầu tiên đã chạy thành công

Như ở phần cuối của bài tĩnh và bài cuối trong PHP mình có nói là giữa tĩnh và bản thân nó khác nhau ở một số trường hợp. Và để chứng minh cho điều đó thì bài hôm nay mình sẽ giới thiệu với mọi người những sự thật khác nhau đó

1, Tổng quan

Nhìn chung thì cả

ConNguoi
ConNguoi
5 và
ConNguoi
ConNguoi
6 đều dùng để gọi các thành phần tĩnh trong đối tượng, nhưng nếu chỉ đơn thuần như trong lớp nội bộ thì cả 2
ConNguoi
ConNguoi
7 này đều cho kết quả tốt

VD

';
        echo static::$name;
    }
}

ConNguoi::getName();

Kết Quả

ConNguoi
ConNguoi

Vậy liệu nó có cho ra các giá trị khác nhau khi chúng ta sử dụng tính kế thừa trong lớp không?

2, So Sánh và kết luận

Vẫn là lớp ConNguoi as on but we will khai báo thêm một lớp NguoiLon kế thừa lớp ConNguoi and override lại thuộc tính $name as after

';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();

Sau khi run line on thì mình thu được kết quả như sau

ConNguoi

Fatal error: Cannot access private property NguoiLon::$name

-Như các bạn đã thấy. Đối với self thì kết quả chạy như bình thường, còn với static thì sao nó báo lại là không thể truy cập vào thuộc tính private mà lại là NguoiLon. $name, phải chăng dây tĩnh này đại diện cho đối tượng hiện tại nên không thể truy xuất thuộc tính $name. Thôi được rồi, để chắc ăn hơn thì mình thử đổi khả năng hiển thị của biến $name thành protected xem sao?

________số 8

Và đây là kết quả mình nhận được


ConNguoi
NguoiLon

Time has been running good, but when it again for 2 results other nhau. Từ 2 ví dụ trên chúng ta tạm thời  thiêu ra   kết luận là static nó có nguyên tắc gần như

ConNguoi
ConNguoi
8, đều truy xuất đến các đối tượng hiện tại

Để ok hơn nữa thì mình sẽ tiếp tục tạo ví dụ sau và chạy nó

ConNguoi
ConNguoi
1

Ok, nó đã chạy được và cho ra kết quả giống với kết luận ở trên. Lúc này thì không cần phải sợ hãi gì nữa mà không có câu kết luận khẳng định

Kết Luận

Bản thân. Truy xuất đến lớp khai báo nó. tĩnh. Truy xuất đến đối tượng hiện tại

3, Lời kết

-Như vậy mình đã giới thiệu xong đến tất cả mọi người về sự khác nhau của self và static trong PHP, ngoài ra các bạn có thể xem thêm bài so sánh giữa this và self trong PHP của mình tại đây

4, Nguồn

-https. //toidicode. com/self-va-static-trong-php-128. html

Đã đăng ký Bản quyền

Php mình

Đã đăng vào ngày 29 tháng 1 năm 2018 3. 18 SA 3 phút đọc

Đặt vấn đề

Chúng ta cùng nhau tìm hiểu thông qua một số đoạn mã ví dụ dưới đây. Giả sử chúng ta có hạng Xe như sau

ConNguoi
ConNguoi
2

Ta có thể thấy phương thức

ConNguoi
ConNguoi
9 của lớp
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
0 là phương thức tĩnh. The must be used that not started to create a object

ConNguoi
ConNguoi
5

Kết quả sẽ là

ConNguoi
ConNguoi
6

Từ khóa self will call function

';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
1 thuộc về lớp
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
0 và in ra dòng chữ "I am a Car" as on. Bây giờ chúng ta sẽ tạo thêm một lớp gọi là lớp
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
3 kế thừa lớp
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
0 ở trên

ConNguoi
ConNguoi
0

';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
5 kế thưà
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
6 nên dĩ nhiên sẽ kế thừa hàm model() đã được định nghĩa ở
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
6. Vì vậy theo bạn thì điều gì sẽ xảy ra khi thay vì gọi
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
8 chúng ta sẽ gọi
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
9 như thế này ?

ConNguoi
ConNguoi
1

Không phải đâu, kết quả thật sự vẫn sẽ là

ConNguoi
ConNguoi
2

Bản thân

Chuyện gì đã xảy ra ở bên trên ? . Bởi vì từ khóa

ConNguoi
ConNguoi
5 đã tham chiếu đến lớp chính đã xác định nghĩa của nó (
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
6) thay vì
ConNguoi

Fatal error: Cannot access private property NguoiLon::$name
1 hiện tại. Điều này dẫn đến công việc nó sẽ gọi hàm
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    protected static $name = 'NguoiLon';
}
// NguoiLon::getName();
$a = new NguoiLon();
$a->getName();
0 của
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
6 thay vì gọi hàm
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    protected static $name = 'NguoiLon';
}
// NguoiLon::getName();
$a = new NguoiLon();
$a->getName();
0 của
ConNguoi

Fatal error: Cannot access private property NguoiLon::$name
1.
Như ta thấy ở trên, phương thức
ConNguoi
ConNguoi
9 đã định nghĩa ở
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
6 đã không bị ghi đè trong
ConNguoi

Fatal error: Cannot access private property NguoiLon::$name
6. Bởi vì từ khóa
ConNguoi
ConNguoi
5 đã tham chiếu đến chính class đã định nghĩa nó (
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
6) thay vì
ConNguoi

Fatal error: Cannot access private property NguoiLon::$name
1 hiện tại. Điều này dẫn đến việc nó sẽ gọi hàm
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    protected static $name = 'NguoiLon';
}
// NguoiLon::getName();
$a = new NguoiLon();
$a->getName();
0 của
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
6 thay vì gọi đến
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    protected static $name = 'NguoiLon';
}
// NguoiLon::getName();
$a = new NguoiLon();
$a->getName();
0 của
ConNguoi

Fatal error: Cannot access private property NguoiLon::$name
1...
Trường hợp trên chả phù hợp với tính đa hình trong oop chút nào cả. Lớp con kế thừa lớp cha mà không thể ghi đè lên nó. Và vì vấn đề trên nên từ phiên bản PHP 5. 3 trở đi đã cung cấp cho chúng ta một điểm mới gọi là
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    protected static $name = 'NguoiLon';
}
// NguoiLon::getName();
$a = new NguoiLon();
$a->getName();
4

Liên kết tĩnh và tĩnh muộn

Bây giờ ở lớp Xe ta thực hiện một thay đổi nhỏ. Thay vì dùng từ khóa

ConNguoi
ConNguoi
5 ta chuyển đổi nó thành
ConNguoi
ConNguoi
6 như sau

ConNguoi
ConNguoi
3

Và thực hiện lại lời gọi hàm

';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
9 ta sẽ thấy kết quả trả về như ta mong muốn

ConNguoi
ConNguoi
1

Đây chính là cái gọi là liên kết tĩnh muộn trong PHP. Khi sử dụng từ khóa

ConNguoi
ConNguoi
6 thay vì
ConNguoi
ConNguoi
5, thì khi ta gọi một chức năng tĩnh, nó sẽ tham chiếu đến lớp mà nó được gọi thay vì lớp đã định nghĩa nó như khi ta sử dụng từ khóa
ConNguoi
ConNguoi
5.
Trong trường hợp này, ta gọi
ConNguoi
ConNguoi
9 từ
ConNguoi

Fatal error: Cannot access private property NguoiLon::$name
1 nên nó tham chiếu đến
ConNguoi

Fatal error: Cannot access private property NguoiLon::$name
1 và sẽ gọi đến
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    protected static $name = 'NguoiLon';
}
// NguoiLon::getName();
$a = new NguoiLon();
$a->getName();
0 của

ConNguoi
NguoiLon
5 thay vì
';
        echo static::$name;
    }
}
class NguoiLon extends ConNguoi
{
    private static $name = 'NguoiLon';
}

NguoiLon::getName();
6 như ở trường hợp ta sử dụng từ khóa
ConNguoi
ConNguoi
5

Kết luận

Qua bài viết nhỏ trên mình xin phân biệt sự khác nhau giữa "self" và "static" trong PHP. Mong nhận được sự đóng góp ý kiến, chỉnh sửa từ mọi người