Как преобразовать класс объекта в строку

Как я могу преобразовать следующий объект в строку:

$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,','))
  1. $ssh это экземпляр некоторого класса. Вы используете это выше как $ssh->exec(...), Вы должны проверить значение, которое он возвращает (вероятно, строку) и strripos() на это, а не на $ssh,

  2. 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() больше напоминает код С).

Другие вопросы по тегам