0

我是 php 新手,我对这段代码有疑问

我不明白,为什么“回声”打印:x?错误 3000

3000是关键,确实应该是打印“扫描仪错误”...

我的代码有什么问题?谢谢大家...

    <?php

// ....................................... sym
class Error
{
 const lexer    =   1000 ;
 const parser   =   2000 ;
 const scanner  =   3000 ;

}

final class err extends Error
{
 public $stringerr = array (
    lexer       =>  "Lexer error" ,
    parser      =>  "Parser error" ,
    scanner     =>  "Scanner error" 
 ) ; 
 public function error ( $x )
 {
    echo "\nx" . " ? " . $stringerr[ $x ] . " error ";


    return $x ;
 }

}


?>


    echo err::error( err::scanner ) ;

输出 :

   x ? error 3000
4

3 回答 3

1

echo 用于在屏幕上打印 + 在您返回的函数中 $x 没有收到任何更改。

尝试:

return $stringerr[$x];

代替:

echo "\nx" . " ? " . $stringerr[ $x ] . " error ";
return $x;
于 2013-08-01T16:12:43.420 回答
1

您的错误是在调用静态函数时使用了非静态属性。你可以看到关于它的 php 通知:

PHP 注意:未定义变量:第 19 行 file.php 中的 stringerr

方法一

您应该将属性定义为静态并通过类名应用到它:

<?php
class Error
{
    const lexer    =   1000 ;
    const parser   =   2000 ;
    const scanner  =   3000 ;

}

final class err extends Error
{
    public static $stringerr = array (
        Error::lexer       =>  "Lexer error" ,
        Error::parser      =>  "Parser error" ,
        Error::scanner     =>  "Scanner error"
        ) ;
    public static function error ( $x )
    {
        echo "\nx" . " ? " . err::$stringerr[ $x ] . " error ";
        return $x ;
    }

}

echo err::error( err::scanner ) ;
?>

印刷:

x ? Scanner error error 3000

提一下,我故意将误差函数定义为静态的。

方法二

或者定义这个类的一个实例并使用$this

<?php
class Error
{
    const lexer    =   1000 ;
    const parser   =   2000 ;
    const scanner  =   3000 ;

}

final class err extends Error
{
    public $stringerr = array (
        Error::lexer       =>  "Lexer error" ,
        Error::parser      =>  "Parser error" ,
        Error::scanner     =>  "Scanner error"
        ) ;
    public function error ( $x )
    {
        echo "\nx" . " ? " . $this->stringerr[ $x ] . " error ";
        return $x ;
    }

}

$var = new err();
echo $var->error( Error::scanner ) ;
?>

http://www.php.net/manual/en/language.oop5.static.php

于 2013-08-01T16:18:27.490 回答
1

如果我理解正确

err::scanner= 3000

$stringerr[ $x ]==$stringerr[3000]

你需要做err::error('scanner');

或者:

public $stringerr = array (
    1000 => "Lexer error",
    2000 => "Parser error",
    3000 => "Scanner error" 
);

而且,$stringerr[ $x ]应该是$this->stringerr[$x]

于 2013-08-01T16:06:59.433 回答