2

我有一些代码想做成一个函数,因为我想在代码的不同部分和不同的页面上使用它,而且我不想到处都有代码。我正在使用 PHPseclib 库和类。独立工作的代码是:

    set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
include('phpseclib/Net/SSH2.php');

$ssh = new Net_SSH2('$address');
if (!$ssh->login('$username', '$password')) {
    exit('Login Failed');
}


$sPath = "minecraft/servers/";
$sSavingCode = "server.properties";
$motd = "test";

echo $ssh->exec("cat > $sPath$sSavingCode <<EOF
motd=".$motd."
EOF
");

我想把它变成一个函数,所以我试着这样做:

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib'); 包括('phpseclib/Net/SSH2.php');

 $ssh = new Net_SSH2('$address');
    if (!$ssh->login('$username', '$password')) {
        exit('Login Failed');
    }    
function test($motd)
    {
        $sPath = "minecraft/servers/";
        $sSavingCode = "server.properties";

        $ssh->exec("cat > $sPath$sSavingCode <<EOF
        motd=".$motd."
        EOF
        ");
    }

其余代码在函数之外和之上。我正在尝试调用该函数,例如:

$motd = "Server";
test($motd);

但这会带来服务器错误。这个功能可以吗?还是应该每次我想使用它时把代码放在我需要的地方?

4

2 回答 2

4

您的函数依赖于$ssh,因此应将其作为参数传递:

function test(Net_SSH2 $ssh, $motd)
{
    $sPath = "minecraft/servers/";
    $sSavingCode = "server.properties";

    $ssh->exec("cat > $sPath$sSavingCode <<EOF
    motd=".$motd."
    EOF
    ");
}

$ssh = new Net_SSH2('$address');
// ... 
test($ssh, $motd);
于 2013-02-05T23:36:14.610 回答
-1

当您想要在函数之外定义的 $ssh 变量时,您正在访问本地 $ssh 变量。

所以在你的函数中声明'global $ssh'并使用它,否则你试图在本地调用exec,这是未定义的。

$ssh = new Net_SSH2('$address');
if (!$ssh->login('$username', '$password')) {
    exit('Login Failed');
}    
function test($motd)
{
    global $ssh;
    $sPath = "minecraft/servers/";
    $sSavingCode = "server.properties";

    $ssh->exec("cat > $sPath$sSavingCode <<EOF
    motd=".$motd."
    EOF
    ");
}

或者,预定义的 php 数组 $Globals 允许您在不定义本地变量的情况下访问这些变量

$ssh = new Net_SSH2('$address');
if (!$ssh->login('$username', '$password')) {
    exit('Login Failed');
}    
function test($motd)
{

    $sPath = "minecraft/servers/";
    $sSavingCode = "server.properties";

    $GLOBALS['ssh']->exec("cat > $sPath$sSavingCode <<EOF
    motd=".$motd."
    EOF
    ");
}
于 2013-02-05T23:32:38.730 回答