Как преобразовать класс объекта в строку
Как я могу преобразовать следующий объект в строку:
$ssh->exec('tail -1 /var/log/playlog.csv');
Поэтому я могу проанализировать строку как первый параметр в strripos():
if($idx = strripos($ssh,','))//Get the last index of ',' substring
{
$ErrorCode = substr($ssh,$idx + 1,(strlen($ssh) - $idx) - 1); //using the found index, get the error code using substring
echo " " .$Playlist.ReturnError($ErrorCode); //The ReturnError function just replaces the error code with a custom error
}
Как и сейчас, когда я запускаю свой скрипт, я получаю следующее сообщение об ошибке:
strpos() expects parameter 1 to be string
Я видел подобные вопросы, в том числе этот объект класса stdClass не может быть преобразован в строку, однако я все еще не могу найти решение.
1 ответ
Есть две проблемы с этой строкой кода:
if($idx = strripos($ssh,','))
$ssh
это экземпляр некоторого класса. Вы используете это выше как$ssh->exec(...)
, Вы должны проверить значение, которое он возвращает (вероятно, строку) иstrripos()
на это, а не на$ssh
,strripos()
возвращаетсяFALSE
если он не может найти подстроку или число (это может быть0
) когда это найдет. Но в логическом контексте,0
такой же какfalse
, Это означает, что этот код не может отличить случаи, когда запятая (,
) находится в качестве первого символа строки или не обнаруживается вообще.
Если предположить, $ssh->exec()
возвращает вывод удаленной команды в виде строки, правильный способ написать этот код:
$output = $ssh->exec('tail -1 /var/log/playlog.csv');
$idx = strrpos($output, ','); //Get the last index of ',' substring
if ($idx !== FALSE) {
// The value after the last comma is the error code
$ErrorCode = substr($output, $idx + 1);
echo ' ', $Playlist, ReturnError($ErrorCode);
} else {
// Do something else when it doesn't contain a comma
}
Там нет необходимости использовать strripos()
, Он выполняет сравнение без учета регистра, но вы ищете символ, который не является буквой, поэтому регистр не имеет никакого смысла.
Ты можешь использовать strrpos()
вместо этого он дает тот же результат, и это немного быстрее, чем strripos()
,
Альтернативный способ
Альтернативный способ получить тот же результат заключается в использовании explode()
разделять $output
на части (разделенные запятой) и получить последний кусок (используя end()
или же array_pop()
) как код ошибки:
$output = $ssh->exec('tail -1 /var/log/playlog.csv');
$pieces = explode(',', $output);
if (count($pieces) > 1) {
$ErrorCode = (int)end($pieces);
echo ' ', $Playlist, ReturnError($ErrorCode);
} else {
// Do something else when it doesn't contain a comma
}
Это не обязательно лучший способ сделать это. Это, однако, более читабельно и более идиоматично для PHP (код, который использует strrpos()
а также substr()
больше напоминает код С).