Допустим, у меня есть класс, который принимает массив 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"
Имейте в виду, что это всего лишь пример. Реальный класс может принимать очень большой и сложный массив. Знание номера строки в этом случае может быть очень полезным.
Невозможно определить строку (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 ().
Других решений пока нет …