【问题标题】:parse error, expecting `T_PAAMAYIM_NEKUDOTAYIM' error in activecollab model class解析错误,预计 activecollab 模型类中出现“T_PAAMAYIM_NEKUDOTAYIM”错误
【发布时间】:2012-05-22 12:49:27
【问题描述】:

我正在处理activecollab自定义模块的权限,当尝试调用静态方法的函数时收到此错误消息不知道为什么;请做帮助将是真正appericiatable ..

Parse error: parse error, expecting `T_PAAMAYIM_NEKUDOTAYIM' in D:\wamp\www\activecollab\public\activecollab\3.0.9\modules\projectcomrequest\models\Projectcomrequests.class.php on line 130

我在模型文件中做的代码是:

  class Projectrequests extends DataManager {

   ...
   ....

        function getPermissionValue($name){
            $roles = Roles::find();
            foreach($roles as $role) {
                if($role->getPermissionValue($name))
                    return true;
                else
                    return false;
        }

        static function canAccess() {
          if(self::getPermissionValue('can_use_project_request')) return true;
            return false;
        } // canAccess

  ...
  ..

  }

通过这个调用控制器:

echo Projectrequests::canAccess();

【问题讨论】:

  • 我看到您在静态函数 canAccess() 中使用了 $this,这是不允许的,但不应导致该特定错误
  • 完美的例子说明为什么不应该为控制结构省略花括号。把它们排除在外,你既不聪明也不整洁。 Voted to closeOr maybe a dupe?
  • 我不同意,这是一个更好的例子,说明为什么你应该在下一行而不是在行尾使用花括号。
  • @SLC 在他的代码中哪里可以看到结尾的大括号?他所有的} 都在他们自己的路线上或默默暗示(这是我的重点)
  • @Mike 如果你看到他的foreach(...) { 在同一行有{。如果他把它放到换行符上,就会更明显的是缺少},因为它们不会垂直排列。

标签: php permissions module controller activecollab


【解决方案1】:
    foreach($roles as $role) {
        if($role->getPermissionValue($name))
            return true;
        else
            return false;

你错过了一个结束 } 那里。所以应该是:

  class Projectrequests extends DataManager {

   ...
   ....

        function getPermissionValue($name){
            $roles = Roles::find();
            foreach($roles as $role) {
                if($role->getPermissionValue($name))
                    return true;
                else
                    return false;
            } // <-- here
        }

        static function canAccess() {
          if(self::getPermissionValue('can_use_project_request')) return true;
            return false;
        } // canAccess

  ...
  ..

  }

【讨论】:

  • 那个 foreach 有点没用,因为它现在只循环一次。
  • 不超过规定的范围并不总是回答和帮助一个人的最佳方法。
  • 它是否解决了 OP 要求的错误? :) 我认为是的。
  • 事实上,没有。它引入了其他错误(例如“只在 foreach 中循环一次”)。
  • 不。它根本没有介绍。我的修复(一个右括号)如何引入一个错误,即 foreach 只循环一次?鉴于此代码,这将 - 总是 - 发生。它没有引入,它在原始代码中。当然,原始代码的错误不仅仅是缺少括号,但该括号导致原始帖子中的给定错误。因此,这就是我的回答。故事结束。
【解决方案2】:

当您尝试在canAccess() 的第一行调用时,静态方法没有类上下文$this。您应该调用self:: 而不是$this-&gt; 来访问类上下文,然后您只能调用其他静态字段和方法。您必须将getPermissionValue 也设为静态。

还有一些错误:

  • 您在 foreach 中忘记了 {。为您修复了这个问题(仅在循环内返回 true,else 构造是无用的,否则您的 foreach 只会循环一次)。
  • 您可以立即将调用的值返回到 canAccess 中的 getPermissionValue,因为它无论如何都是布尔值(if-else 构造有点没用)。

更正的代码:

static function getPermissionValue($name){
    $roles = Roles::find();
    foreach($roles as $role) {
        if($role->getPermissionValue($name))
            return true;
    }    
    return false;
}

static function canAccess() {
    return self::getPermissionValue('can_use_project_request');
} // canAccess

我也想建议使用publicprivate 之类的访问修饰符,因为这是一种很好的做法。

【讨论】:

  • publicprivate 不是必需的。从方法声明中省略时,将使用public。另一方面,鼓励将方法标记为static,因为当静态调用未标记为静态的方法时,PHP 会引发警告(或注意,不记得了)。
  • 没错,这不是必需的,但我认为这样做是一种很好的做法。
【解决方案3】:
<?php
class Projectrequests extends DataManager {

   ...
   ....

        function getPermissionValue($name){
            $roles = Roles::find();
            foreach($roles as $role) {
                if($role->getPermissionValue($name))
                    return true;
                else
                    return false;
            } // <!---- YOUR ERROR IS HERE
        }

        static function canAccess() {
          if($this->getPermissionValue('can_use_project_request')) return true;
            return false;
        } // canAccess

  ...
  ..

  }

另外,静态方法无权访问$this,您需要改用self::

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2017-02-17
    • 2018-09-04
    • 1970-01-01
    • 2013-12-15
    相关资源
    最近更新 更多