Пользовательское сообщение об исключении с номером строки

Допустим, у меня есть класс, который принимает массив SomeClass при создании экземпляра, например:

class ConfigurableClass
{
public function __construct( array $config = array() )
{
foreach( $config as $param )
{
if( !$param instanceof SomeClass )
{
$type = gettype($param);
$line = ? // How can I retrieve this?
throw new Exception("ConfigurableClass config parameters must be of type SomeClass, $type given in line $line");
}
}
}
}

И скажем, этот класс создан в другом файле с массивом, который имеет один элемент неправильного типа, например:

$instance = new ConfigurableClass(array(
new SomeClass(),
new SomeClass(),
new SomeClass(),
'Ooops!',       // String type, line 5
new SomeClass()
));

Как я могу выдать сообщение об ошибке с указанием номера строки, где был вставлен неправильный тип объекта?
В этом случае соответствующее сообщение должно гласить:

"ConfigurableClass config parameters must be of type SomeClass, string given in line 4"

Имейте в виду, что это всего лишь пример. Реальный класс может принимать очень большой и сложный массив. Знание номера строки в этом случае может быть очень полезным.

0

Решение

Невозможно определить строку (5 в вашем случае), потому что она дается в конце инструкции вызывающей стороны, то есть где находится точка с запятой (7 в вашем случае).

Однако вы можете получить хорошее приближение, указав номер строки и неправильный номер параметра.

<?php
class ConfigurableClass
{
public function __construct( array $config = array() )
{
$counter = 0;

foreach( $config as $param )
{
if( !$param instanceof SomeClass )
{
$type = gettype($param);
$line = debug_backtrace()[0]['line'];
throw new Exception("ConfigurableClass config parameter[$counter] must be of type SomeClass, $type given in line $line");
}

$counter++;
}
}
}

Сообщение будет примерно таким:

Неустранимая ошибка: необработанное исключение «Исключение» с сообщением «Конфигурационный параметр ConfigurableClass [3] должен иметь тип SomeClass, строка указывается в C: \ your \ folder \ origin_file.php в строке 12 ‘в C: \ your \ folder \ ConfigurableClass. PHP на линии 15

Если в сообщении вы хотите избежать ссылки на файл и строку ConfigurableClass, вы должны создать свой собственный производный класс исключений и перезаписать метод __toString ().

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector