具有PRIVATE-static-method回调的set_error_handler

时间:2019-03-16 17:30:31

标签: php

是否可以将私有静态方法用作set_error_hander回调?

这很好:

<?php
    class DisplayErrors{

        private static $email_address = 'myemail@mail.com';

        public static function error_handler($number, $message, $file, $line, $vars) {
            // send error to email;
        }

        private static function toEmail(){
            // set_error_handler('self::error_handler');
            set_error_handler(__CLASS__ .'::error_handler');
        }

    }

这既没有效果也没有错误:

<?php
    class DisplayErrors{

        private static $email_address = 'myemail@mail.com';

        private static function error_handler($number, $message, $file, $line, $vars) {
            // changed to private static method;
        }

        private static function toEmail(){
            // set_error_handler('self::error_handler');
            set_error_handler('self::error_handler');
        }

    }

我也尝试过:

set_error_handler(array('self','error_handler'));
// no effect no error
set_error_handler('&self::error_handler');
// invalid callback

1 个答案:

答案 0 :(得分:1)

如果您使用的是PHP 7.1或更高版本,则新的closure::fromCallable方法将允许您执行此操作。

    private static function toEmail(){
        set_error_handler(Closure::fromCallable('static::error_handler'));
    }

Closure::fromCallable()在调用范围内评估可调用参数,因此在类中使用时可以接受私有和受保护的方法。