【问题标题】:How access class propery which is array? PHP [closed]如何访问数组中的类属性? PHP [关闭]
【发布时间】:2013-10-30 03:55:55
【问题描述】:

我无法访问我的课程属性之一!代码如下:

Class Validation {

public $errorMsg = array( 1000 => 'Some Error',
                              1001 => 'Some other error');

static function validateText($value) {

if (!empty($value)) {
        if (ctype_alpha($value)) {
    return false;
     } else { 
            return $this->errorMsg[1001]; //getting error here
     }
    } else {
        return $this->errorMsg[1001];//getting error here
    }
}

我的日志告诉我:PHP Fatal error: Using $this when not in object context

我怎样才能访问这个数组???

【问题讨论】:

标签: php oop this


【解决方案1】:

你的函数validateText() 是一个static 函数;因此,它不属于Validation 类的单个“实例”,而是属于它们中的所有,因此不适用于$this 关键字。

您的选择是从函数声明中删除 static 或将 $errorMsg 本身设为静态(根据它的定义,这可能是一个不错的选择):

public static $errorMsg = array( 1000 => 'Some Error',
                              1001 => 'Some other error');

static function validateText($value) {

    if (!empty($value)) {
        if (ctype_alpha($value)) {
            return false;
        } else { 
            return Validation::$errorMsg[1001]; //getting error here
        }
    } else {
        return Validation::$errorMsg[1001];//getting error here
    }
}

附加组件(常量与静态)
根据推荐的 cmets,我还添加了“适当”的方式来处理您的确切情况。以上将修复您的错误,但是,这不是将“错误消息”作为类属性处理的最佳方法。除了使用static,您可以使用const 关键字设置常量类成员列表(这不适用于数组,因此您将在此处创建多个变量):

class Validation {
    const SOME_ERROR = 'Some Error';
    const SOME_OTHER_ERROR = 'Some other error';

    static function validateText($value) {
        // process value
        return Validation::SOME_ERROR;
    }
}

您还可以通过Validation::SOME_ERRORValidation 类之外访问这些常量,如果您有PHP 5.3+,您可以使用:

$v = new Validation();
echo $v::SOME_ERROR;

【讨论】:

  • 如何在 PHP 中将属性设为静态是更好的解决方案?更不用说课堂上的硬编码错误消息了。
  • @Leri 我对你的问题有点困惑; “如何使属性静态成为一个更可取的解决方案” - 这是一种在无数语言中使用的解决方案,PHP 就是其中之一。这个确切的例子,一个错误消息数组,是一个很好的例子,说明何时/如何在类中使用静态变量,因为它不会在实例之间改变(更不用说方法本身是静态的)。另一个不适用于数组的替代方法是定义一个const(或者,在这种情况下,是几个const 变量)。但是,为了解决 OP 的实际问题,我坚持使用static
  • 主要思想是,虽然这是一个解决方案和正确的解决方案,但它并不比拥有实例变量更好。因为这样你可以拥有多个带有不同错误消息的验证器。如果您想在实例之间共享数据,您可以将相同的数组传递给这些实例。同样使用静态,您可以在整个脚本中创建隐藏的依赖项。
  • 谢谢你的好答案 :) 我选择将 errorMsg 设为静态,因为我在许多情况下将此函数用作静态调用!
  • @Cardiner 好吧,你做错了......在某些时候,你会意识到这一点。 ;)
猜你喜欢
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
相关资源
最近更新 更多