【问题标题】:Attempted to call function from namespace - Silex PHP试图从命名空间调用函数 - Silex PHP
【发布时间】:2017-09-12 02:34:28
【问题描述】:

我对我在 Silex PHP 中的开发有两个疑问。

usersController.php

namespace myworkplaces\controllers;

use Silex\Application;
use Silex\Api\ControllerProviderInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use myworkplaces\models;

class usersController implements ControllerProviderInterface {

    public function connect(Application $app) {
        $controllers = $app['controllers_factory'];
        $controllers->put('/login', array($this, 'login'))->bind('login');
        return $controllers;
    }
    public function login(Application $app, Request $request) {
        $email = $app->escape($request->get('email'));
        $password = $app->escape($request->get('password'));

        if (!filter_var($email, FILTER_VALIDATE_EMAIL))
            return $app->json(array ('type' => 'error', 'message' => 'El email no tiene el formato correcto.'), 202);
        if (strlen($password) < 5)
            return $app->json(array ('type' => 'error', 'message' => 'La contraseña no puede ser menor a 6 carácteres.'), 202);

        if (models\usersModel::checkLogin($app, $email, $password)) {
            return $app->json(array ('type' => 'info', 'message' => '¡Ten un buen día!'), 201);
        } else {
            return $app->json(array ('type' => 'error', 'message' => 'Error en la autentificación.'), 202);
        }
    }}

usersModel.php

namespace myworkplaces\models;

class usersModel {
    function checkEmail($app, $email) {
        if (($app['db']->users)->findOne([ 'email' => $email ], [ 'projection' => [ 'email' => 1 ] ]) != NULL) {
            return true;
        } else {
            return false;
        }
    }
    function getDataUser($app, $id) {
        return ($app['db']->users)->findOne([ '_id' => new \MongoDB\BSON\ObjectID($id) ]);
    }
    function checkLogin($app, $email, $password) {
        if (!checkEmail($app, $email))
            return false;
        if (password_verify($password, ($app['db']->users)->findOne([ 'email' => $email ], [ 'projection' => [ 'hashPassword' => 1 ] ])['hashPassword'])) {
            $user = getDataUser($app, (string)getID($email));
            $app['session']->set('user', array('id' => (string)$user['_id'], 'email' => $user['email'], 'username' => $user['username'], 'superadmin' => $user['superadmin'], 'adminPlaces' => $user['adminPlaces']));
            return true;
        } else {
            return false;
        }
    }}

要访问 myworkplaces\models 命名空间和 usersModel 类中的 checkLogin() 函数,我只能使用这个调用 models\usersModel::checkLogin() 来访问,我认为这不是正确的做法。我不应该能够使用 models\usersModel\checkLogin() 调用该函数吗?

第二个问题是在函数 checkLogin 中,我想在同一个命名空间和同一个类中调用 checkEmail 函数,但是使用像 checkEmail() 这样的调用,你应该能够毫无错误地调用它。发生的错误是,尝试从命名空间“myworkplaces\models”调用函数“checkEmail”。问题出在哪里?

我使用composer的自动加载

"autoload": {
    "psr-4": {
        "myworkplaces\\": "src/"
    }
}

谢谢!

【问题讨论】:

  • 我觉得你上面的代码不好,有错误,你想修复上面的代码。
  • @sahil-gulati 如果我的代码有错误,欢迎所有 cmets :)

标签: php function class namespaces silex


【解决方案1】:

这里我假设没有其他语法错误,并且您的类加载器工作正常。

在你的controller.php

将其更改为:

if (models\usersModel::checkLogin($app, $email, $password)) {

这个:

if (\myworkplaces\models\usersModel::checkLogin($app, $email, $password)) {

在你的usersModel.php

将其更改为:

function checkEmail($app, $email) {

这个:

public function static checkEmail($app, $email) {

将其更改为:

if (!checkEmail($app, $email))

这个:

if (!self::checkEmail($app, $email))

【讨论】:

  • 好吧,你用代码说的是,在 PHP 中,未实例化的类的函数必须是静态的,这与其他语言不同。非常感谢,希望能帮助有同样疑问的人更好地理解。
  • 在 controller.php 中你不必调用函数 \myworkplaces\models\usersModel::checkLogin (),因为有一个 use myworkplaces\models"。使用 models\usersModel::checkLogin () 有效。我的问题是这样使用它是否正确。至于 usersModel.php 的更改,静态函数中不需要 public,因为默认情况下它已经是 public。
  • 是的,完全没问题。没问题,你可以像models\usersModel::checkLogin() Welcome ... :) 一样使用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多