2010-07-01 33 views
5

tôi đã thách thức làm thế nào để phá vỡ hoặc thực hiện cuối của một hàm cha mẹ mà không sửa đổi mã của phụ huynh, sử dụng PHPBreaking một hàm cha mẹ từ bên trong một hàm con (PHP Ưu tiên sử dụng)

tôi không thể tìm ra bất kỳ giải pháp, khác hơn là chết(); trong đứa trẻ, mà sẽ kết thúc tất cả thực hiện, và vì vậy bất cứ điều gì sau khi cuộc gọi chức năng cha mẹ sẽ kết thúc. Bất kỳ ý tưởng? Ví dụ

mã:

function victim() { 
    echo "I should be run"; 
    killer(); 
    echo "I should not"; 
} 
function killer() { 
    //code to break parent here 
} 
victim(); 
echo "This should still run"; 
+0

http://php.net/register_tick_function - các chức năng đánh dấu là tối nghĩa, có thể là những cơn ác mộng về hiệu suất và một số tài liệu kém. Nhưng chúng cho phép bạn thực hiện có hiệu quả một hàm mà bạn chọn mỗi câu lệnh n. Có nghĩa là chức năng đánh dấu của bạn có thể thực hiện ở giữa việc thực hiện bất kỳ chức năng nào khác. –

+0

@Frank Tôi sẽ quan tâm làm thế nào mà có thể trở thành một giải pháp cho "vấn đề" này. Bằng mọi cách, ai đó đăng câu trả lời, làm ơn! :) – deceze

+0

Đối với hồ sơ, [runkit_function_redefine()] (http://us3.php.net/manual/en/function.runkit-function-redefine.php) không thích nó khi bạn xác định lại chức năng hiện đang chạy . :) –

Trả lời

7
function victim() { 
    echo "I should be run"; 
    killer(); 
    echo "I should not"; 
} 
function killer() { 
    throw new Exception('Die!'); 
} 

try { 
    victim(); 
} catch (Exception $e) { 
    // note that catch blocks shouldn't be empty :) 
} 
echo "This should still run"; 
+0

ok cảm ơn, tôi nghĩ cho một số lý do ngoại lệ sẽ trở về nạn nhân() ;. là có cách nào để làm một điều như vậy mà không có khối thử? –

+0

@Fran Không (tốt, có thể nội bộ nó có thể, nhưng nó sẽ rất hacky). Bạn có thể xử lý ngoại lệ bên trong nạn nhân, quấn nạn nhân vào một hàm khác có thể xử lý ngoại lệ hoặc chỉ trả về giá trị boolean trong kẻ giết người cho biết liệu việc thực hiện có nên tiếp tục và có sự tôn trọng nạn nhân hay không. – Artefacto

+0

Thats những gì tôi figured, tôi đã tò mò hơn rằng bất cứ điều gì. cảm ơn các bạn! –

0

Lưu ý rằng trường hợp ngoại lệ sẽ không làm việc trong các tình huống sau:

function victim() { 
    echo "this runs"; 
    try { 
    killer(); 
    } 
    catch(Exception $sudden_death) { 
    echo "still alive"; 
    } 
    echo "and this runs just fine, too"; 
} 

function killer() { throw new Exception("This is not going to work!"); } 

victim(); 

Bạn sẽ cần một cái gì đó khác, điều duy nhất mạnh mẽ hơn sẽ một cái gì đó như cài đặt xử lý lỗi của riêng bạn, đảm bảo tất cả các lỗi được báo cáo cho trình xử lý lỗi và đảm bảo lỗi không được chuyển đổi thành ngoại lệ; sau đó kích hoạt lỗi và xử lý lỗi của bạn sẽ giết tập lệnh khi hoàn tất. Bằng cách này bạn có thể thực thi mã bên ngoài ngữ cảnh của kẻ giết người()/nạn nhân() và ngăn nạn nhân() hoàn thành bình thường (chỉ khi bạn giết kịch bản như một phần của trình xử lý lỗi).

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