【问题标题】:How to convert object class into string如何将对象类转换为字符串
【发布时间】:2018-09-12 13:33:36
【问题描述】:

如何将以下对象转换为字符串:

$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

我见过类似的问题,包括这个 Object of class stdClass could not be converted to string ,但我似乎仍然无法提出解决方案。

【问题讨论】:

  • $ssh的类型是什么?你应该在$ssh->exec()返回的值上strripos(),而不是$ssh
  • 这就是我想要实现的目标,我正在考虑将$ssh 变量(即类型对象)的输出转换为字符串,然后将该字符串解析为strripos()
  • @axiac 可能是,猜我们需要看看 OP 是否回复。
  • @chris85 exec() 函数是一个全局函数,问题中发布的代码使用了某个类的方法(可能包装了SSH2 PHP 扩展提供的函数)。它们不能相同。
  • @axiac 我同意strripos($ssh 不起作用,因为$ssh 不是字符串,所以它不起作用。没有$ssh 定义虽然很难说,除了说分配回报。如果返回是一个对象,甚至是 NULL,则分配返回将不起作用。我想我会删除该评论,直到他们的 exec 所做的事情清楚为止。

标签: php string object ssh ssh2-exec


【解决方案1】:

这行代码有两个问题:

if($idx = strripos($ssh,','))
  1. $ssh 是某个类的实例。你在上面使用它作为$ssh->exec(...)。你应该检查它返回的值(可能是一个字符串)和strripos(),而不是$ssh

  2. strripos() 在找到子字符串或数字(可以是0)时返回FALSE。但在布尔上下文中,0false 相同。这意味着此代码无法区分逗号 (,) 是作为字符串的第一个字符还是根本找不到的情况。

假设$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() 的代码更像 C 代码)。

【讨论】:

  • exec 的输出分配给诸如$output 之类的变量是我所追求的,所以我现在可以将其解析为strripos(),但是您的strripos() 函数没有输出最后一个 ',' 之后的任何内容。我知道这与我最初的问题无关,但如果你能提供帮助,我可以上传相关代码,因为我似乎无法弄清楚我哪里出错了..
  • 尽管如此,我仍然会接受您的回答,因为这是原始问题的解决方案。
  • 我不明白你。如果$idx 不是FALSE,则substr($output, $idx + 1) 返回最后一个逗号后开始的$output。如果逗号是$output 中的最后一个字符,它当然会返回一个空字符串。
  • 这就是我的$output 返回的内容:2018-03-22 12:43:21,NM_Test.h264,-2 .. 最后一个逗号后总会有一个数字,我有一个 switch case function ReturnError(res) 所以我想得到我的 strripos() 函数来查看 ',' 之后的最后一个输出,并将其与我的 ReturnError(res) 函数中的大小写匹配。
  • $output 的值可能以换行结束。您应该将错误代码转换为整数。在这里查看:3v4l.org/ek5tv
猜你喜欢
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 2017-02-07
  • 2021-02-03
  • 2018-07-19
  • 2012-09-02
  • 2011-09-30
  • 1970-01-01
相关资源
最近更新 更多