error de análisis, esperando el error `T_PAAMAYIM_NEKUDOTAYIM' en la clase de modelo activecollab

Estoy trabajando en los permisos del módulo personalizado activecollab y recibo este mensaje de error cuando intento llamar a la función del método estático, no sé por qué; por favor ayuda será realmente apreciable ..

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

el código que hice en el archivo modelo es:

  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

  ...
  ..

  }

llamando al controlador por esto:

echo Projectrequests::canAccess();

preguntado el 22 de mayo de 12 a las 13:05

Veo que estas usando $this dentro de la función estática canAccess(), que no está permitido, pero no debería causar ese error en particular:

Ejemplo perfecto de por qué las llaves nunca deben omitirse para las estructuras de control. No estás siendo inteligente ni ordenado al dejarlos fuera. votado para cerrar. ¿O tal vez un tonto? -

No estoy de acuerdo, es un mejor ejemplo de por qué debería tener llaves en la siguiente línea, en lugar de al final de una línea. -

@SLC ¿Dónde ve una llave de cierre final en su código? todo su } están en su propia línea o implícitamente en silencio (que fue el enfoque de mi punto) -

@Mike si ves el suyo foreach(...) { tiene la { en la misma línea. Si lo pusiera en una nueva línea, sería más obvio que faltaba } porque no se alinearían verticalmente. -

3 Respuestas

    foreach($roles as $role) {
        if($role->getPermissionValue($name))
            return true;
        else
            return false;

Te estás perdiendo un cierre } allí. Entonces debería ser:

  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

  ...
  ..

  }

contestado el 22 de mayo de 12 a las 13:05

Ese foreach es un poco inútil ya que ahora solo se repite una vez. - styxxy

No mirar más allá de lo indicado no siempre es el mejor enfoque para responder y ayudar a una persona. - styxxy

¿Resuelve el error como lo solicitó el OP? :) Creo que sí. - psynott

De hecho, no, no lo hace. Introduce otros errores (como ese "bucle solo una vez en foreach"). - styxxy

No. No introduce eso en absoluto. ¿Cómo mi solución (de una llave de cierre) introduce un error en el que el foreach solo da una vuelta? Eso -siempre- sucedería dado este código. No es Introducido, estaba en el código original. Por supuesto, el código original tiene muchos más errores que solo un corchete faltante, pero ese corchete estaba causando el error dado en la publicación original. Por lo tanto, eso es lo que respondí. Fin de la historia. - psynott

Un método estático no tiene un contexto de clase. $this mientras intenta llamar en la primera línea de canAccess(). Deberías llamar self:: en lugar de $this-> para acceder al contexto de la clase y luego solo puede llamar a otros campos y métodos estáticos. tendrás que hacer getPermissionValue también estático.

Algunos errores más:

  • Olvidaste un { en tu foreach. Se solucionó esto para usted (solo devuelve verdadero dentro del bucle, la construcción else es inútil porque, de lo contrario, su foreach solo se repite una vez).
  • Puede devolver inmediatamente el valor de la llamada a getPermissionValue in canAccess ya que es un booleano de todos modos (la construcción if-else es un poco inútil).

Código corregido:

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

Me gustaría aconsejarme también sobre el uso de modificadores de acceso como public y private ya que es una buena práctica.

contestado el 22 de mayo de 12 a las 19:05

public y private no son necesarios. Cuando se omite de la declaración del método, public se utilizará. Métodos de marcado como static por otro lado, se recomienda, porque PHP genera una advertencia (o aviso, no puedo recordar) cuando el método que no está marcado como estático se llama estáticamente. - Ilija

Es cierto que no es obligatorio, pero en mi opinión es una buena práctica hacerlo. - styxxy

<?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

  ...
  ..

  }

Además, los métodos estáticos no tienen acceso a $this necesitas usar self::

contestado el 22 de mayo de 12 a las 13:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.