2012-06-29 25 views
11

Tôi đang cố gắng sử dụng một hàm PHP từ bên trong một hàm public static như vậy (những điều tôi đã rút ngắn một chút):Không thể truy cập tự :: khi không có phạm vi lớp đang hoạt động

class MyClass { 

public static function first_function() { 

    function inside_this() {  
      $some_var = self::second_function(); // doesnt work inside this function 
    }    

    // other code here... 

} // End first_function 

protected static function second_function() { 

    // do stuff 

} // End second_function 

} // End class PayPalDimesale 

Đó là khi tôi nhận được lỗi "Không thể truy cập tự :: khi không có phạm vi lớp đang hoạt động".

Nếu tôi gọi second_function ngoài inside_this chức năng, nó hoạt động tốt:

class MyClass { 

public static function first_function() { 

    function inside_this() {  
      // some stuff here 
    }    

    $some_var = self::second_function(); // this works 

} // End first_function 

protected static function second_function() { 

    // do stuff 

} // End second_function 

} // End class PayPalDimesale 

gì tôi cần phải làm gì để có thể sử dụng second_function từ bên trong inside_this chức năng?

+0

Bạn đã thử đóng cửa chưa? 'function inside_this() sử dụng ($ self) {' – bfavaretto

+0

Chỉ cần thử nó- didnt công việc: ( – JROB

+0

tôi nhận ra quá muộn rằng 'self' không phải là một biến ... – bfavaretto

Trả lời

12

Đó là vì Tất cả các hàm trong PHP có phạm vi toàn cầu - chúng có thể được gọi bên ngoài một hàm ngay cả khi chúng được xác định bên trong và ngược lại.

Vì vậy, bạn phải làm:

function inside_this() {  
    $some_var = MyClass::second_function(); 
}  
+1

Tôi nhận được' gọi đến phương pháp bảo vệ lỗi ' – JROB

+2

@JohnRobinson Đó là vì phương pháp đó được bảo vệ – xdazz

+0

@xdazz, có cách nào để lưu * MyClass * vào một biến và chuyển nó vào hàm thay vì mã hóa cứng tên lớp 'MyClass' thành mã? (Nếu không, nếu chúng ta đổi tên của lớp, chúng ta cần phải tìm kiếm và thay thế "MyClass" trong toàn bộ tập tin) – Pacerier

3

trình với PHP 5.4:

<?php 
class A 
{ 
    public static function f() 
    { 
    $inner = function() 
    { 
     self::g(); 
    }; 

    $inner(); 
    } 

    private static function g() 
    { 
    echo "g\n"; 
    } 
} 

A::f(); 

Output:

g 
+0

của anh ấy là 'protected', không phải là' private'. –

+0

@Cole Johnson, riêng tư là * nhiều hơn * hạn chế, đó là lý do tôi sử dụng nó trong ví dụ của mình – Matthew

+3

@Matthew Có tài liệu nào về lý do tại sao điều này không hoạt động trong phiên bản 5.3 của php và nó hoạt động ở phiên bản 5.4 –

0

Hãy thử thay đổi chức năng đầu tiên của bạn để

public static function first_function() { 

    $function = function() {  
      $some_var = self::second_function(); // now will work 
    };    
    ///To call the function do this 
    $function(); 
    // other code here... 

} // End first_function 
Các vấn đề liên quan