2016-01-18 16 views
5

Tôi đã đoạn mã sau:PHP sai mã hoạt động tốt

class A { 
    public function methodB() 
    { 
    // do something 
    return 1; 
    } 
} 


$a = A::methodB(); 

Nó không bao giờ nên làm việc và nó hoạt động trên máy đó! Nó trở lại 1. Thực sự, tôi thề tôi không say.

Tất nhiên nếu tôi chạy nó trên máy tính của tôi hoặc trên máy chủ sản xuất, nó sẽ không hoạt động. Vì bạn không thể gọi các phương thức không tĩnh như tĩnh. Lớp học phải luôn được khởi tạo ngay từ đầu.

Tôi đã lo lắng về điều đó. Suy nghĩ ngày hôm nay khi tôi thiết lập một máy làm việc riêng biệt để thử nghiệm dự án, tôi đã trở lại môi trường ở đó mã này hoạt động.

Mọi thứ trở nên tồi tệ hơn - Tôi có các nhà phát triển trong nhóm, những người vẫn chưa nhận được sự khác biệt rõ ràng giữa các phương pháp tĩnh và không tĩnh. Kết quả là họ có mã những gì hoạt động tốt trên máy tính của họ nhưng nó không thành công trên bất kỳ môi trường nào khác.

TẠI SAO nó hoạt động? Tôi muốn mã như vậy thất bại. Nó không hoạt động.

Cấu hình của máy mà nó hoạt động được như sau:

lang thang @ lang thang-ubuntu-đáng tin cậy-32:/var/www/apotheke $ php -v PHP 5.6.17-3 + deb. sury.org ~ trusty + 1 (cli) Bản quyền (c) 1997-2015 Nhóm PHP Zend Engine v2.6.0, Bản quyền (c) 1998-2015 Zend Technologies với Zend OPcache v7.0.6-dev, Bản quyền (c) 1999 -2015, bởi Zend Technologies

Thực sự, tôi cảm thấy thật ngu ngốc. Tôi có bỏ lỡ điều gì đó không?

+3

Kiểm tra điều này: - http://stackoverflow.com/questions/3754786/calling-non-static-method-with –

+0

Miễn là bạn không sử dụng '$ this', bạn có thể lấy mã này bằng PHP –

+0

Tôi muốn nó thất bại ...... (kiểm tra các tài liệu, phải có một số thiết lập để làm cho nó thất bại tôi hy vọng) – Tebe

Trả lời

4

Đoạn mã trên có giá trị trong PHP 5. From the docs:

Trong PHP 5, gọi phương pháp không tĩnh tĩnh tạo ra một cảnh báo E_STRICT cấp.

Nếu bạn bật lỗi nghiêm ngặt báo cáo cảnh báo như sau đây sẽ được xuất ra:

tiêu chuẩn nghiêm ngặt PHP: Phương pháp không tĩnh A :: methodB() không nên được gọi là tĩnh trong php mã shell trên dòng 1

Xin lưu ý rằng phương pháp sẽ vẫn chạy và trả về một giá trị.

Nó không được chấp nhận trong PHP 7 và không được khuyến khích sử dụng.

Trong PHP 7, gọi các phương thức không tĩnh tĩnh sẽ không được dùng nữa và sẽ tạo cảnh báo E_DEPRECATED. Hỗ trợ gọi các phương thức tĩnh không tĩnh có thể bị xóa trong tương lai.

2

Bạn đang nhận được sau cảnh báo:

tiêu chuẩn nghiêm ngặt: Phương pháp không tĩnh A :: methodB() không nên được gọi là tĩnh

nhưng PHP giả sử bạn muốn chạy nó anyway để thực hiện nó.

Để ngăn chặn điều đó, bạn có thể thay đổi phương pháp của bạn:

class A { 
    public function methodB(){ 
     if(isset($this)){ 
      // do something 
      return 1; 
     } 
    } 
} 

Các lỗi E_STRICT sẽ được ném anyway (mà bạn có thể vô hiệu hóa), nhưng PHP sẽ không giả sử bạn có nghĩa là để chạy nó anyway.

Các vấn đề liên quan