PHP类变量设置/获取问题

时间:2010-01-30 20:40:14

标签: php class variables

我试图编写一个PHP类来获取Linux机器的正常运行时间。 正确获取正常运行时间,但我有一个if语句,用于确定负载平均值是否为“高”并设置警告代码,并且似乎没有工作(它保持在0)。

我已经从课程中包含了所有代码(大约50行)因为我不知道我能拿出什么,但仍然提供了一些关于这里出了什么问题的信息。

<?php
class loadavg {

    private $divisor, $status;

    public function __construct($set_divisor = 1){
        $this->divisor = $set_divisor;
    }

    public function __toString(){
        return $this->load(1).', '.$this->load(5).', '.$this->load(15)."\n";
    }

    public function load($time = 1){
        $loadfile = shell_exec('cat /proc/loadavg');
        $split = preg_split('/ /', $loadfile);

        if ($split[1] > (2 * $this->divisor)){
            $this->status = 3;
        } else if ($split[1] > $this->divisor){
            $this->status = 2;
        } else {
            $this->status = 1;
        }

        switch($time){
            case 1:
                return $split[0];
            case 5:
                return $split[1];
            case 15:
            return $split[2];
        }
    }

    public function status_name(){
        switch ($this->status){
            case 3:
                return 'critical';
            case 2:
                return 'warn';
            case 1:
                return 'ok';
            case 0:
                return 'error';
        }
    }
}
?>

2 个答案:

答案 0 :(得分:1)

您的代码似乎工作正常,但设计使其使用不那么直观。我将您的类定义放在一个文件中,在底部添加以下行,并在运行时打印“ok”。

$load = new loadavg ();
$load->load (5);
echo $load->status_name () . "\n";

对我来说,类的设计很奇怪,它在初始化时不允许“加载”,但是当你尝试打印loadavg对象时,只会自动调用load。如果你希望能够在没有先显式调用load()的情况下访问status_name(),你可以在__construct中调用load(可能有一个合理的默认值,可以像被除数一样被覆盖...)

答案 1 :(得分:1)

<?
class loadavg {

    private $divisor, $status;

    public function __construct($set_divisor = 1){
        $this->divisor = $set_divisor;
    }

    public function __toString(){
        return $this->load(1).', '.$this->load(5).', '.$this->load(15)."\n";
    }

    public function load($time = 1){
        //$loadfile = shell_exec('cat /proc/loadavg');
        $loadfile = '1.5 1.5 1.5';
        $split = preg_split('/ /', $loadfile);

        if ($split[1] > (2 * $this->divisor)){
            $this->status = 3;
        } else if ($split[1] > $this->divisor){
            $this->status = 2;
        } else {
            $this->status = 1;
        }

        switch($time){
            case 1:
                return $split[0];
            case 5:
                return $split[1];
            case 15:
            return $split[2];
        }
    }

    public function status_name(){
        switch ($this->status){
            case 3:
                return 'critical';
            case 2:
                return 'warn';
            case 1:
                return 'ok';
            case 0:
                return 'error';
        }
    }
}

$la = new loadavg();
print($la);
print($la->status_name()); 

我刚刚执行了这个,得到了输出:

1.5, 1.5, 1.5
warn

这不是预期的吗?如果我取出print($ la)语句,则输出为:

error

这是因为永远不会调用load()函数来设置状态。如果要正确打印状态,则必须先运行load()。我假设您要将time参数添加到status_name并在返回之前调用load,如下所示:

public function status_name($time =1){
    $this->load($time);
    switch ($this->status){
        case 3:
            return 'critical';
        case 2:
            return 'warn';
        case 1:
            return 'ok';
        case 0:
            return 'error';
    }
}

现在可以让您这样做:

$la = new loadavg();
print($la->status_name(5));