【问题标题】:Scope of require_once and objectsrequire_once 和对象的范围
【发布时间】:2015-08-12 17:01:47
【问题描述】:

对 PHP 还很陌生,但我仍在努力解决正在出现的范围问题。

一些suedo代码:

此文件包含在根目录中的 index.php 中。

登录.php:

require_once("initialize.php");
//Get the $_POST data from the form submission.
//Call on the user object
User::createNewUser($firstName,$lastName,$email1,$password1);

//HTML
<form>signin stuff</form>

初始化.php:

//Define some path defaults for the site. 
//Load up some scripts.
require_once("session.php");
require_once("user.php");
//and several others

session.php:

class Session...
public $user;
public function login...
$session=new Session()

user.php:

class User...
public static function authenticate($email,$password){...
$session->login($user); //Here is the problem, $session is not defined.

因此,由于某种原因 $session 尚未在 User->authenticate 中定义,如果我在类之前在 user.php 的顶部执行 var_dump 声明它已定义。

这足以继续吗?为什么 $session 没有明确定义。

这是我得到的错误 注意:未定义变量:第 55 行 D:\Program Files\wamp\www\site\application\controllers\user.php 中的会话

感谢您提供的任何帮助。

【问题讨论】:

  • 该语句在方法内部,因此$session 指的是局部变量,除非您另有说明。您可以通过引用全局范围内的变量(非常丑陋且不安全)或将变量移交给方法本身或您从类实例化以使用该方法的对象来表示不同。非常优雅的是带有静态 getter 的会话的单例类,这样您就可以从任何地方引用会话对象,而无需将其放在全局范围内。
  • 不确定你在说什么,所以我正在查找你刚才所说的一些内容。谢谢。
  • 为什么将它放在全局范围内“非常丑陋和不安全”?什么是“单例类”?
  • “丑陋且不安全”,因为所谓的“全局名称空间污染”。想象一下,您有一个使用两个库的项目。现在您和库都在全局范围内声明变量。这很容易导致名称冲突,您甚至无法在 php 中轻松检测到这种冲突。所以你最终会覆盖彼此的价值观! “单例类”是一个实现“单例模式”的类,这是许多众所周知的编程模式之一,因此返回的实现策略经过良好测试并且已知可以工作。你很容易在网上找到解释。

标签: php session scope


【解决方案1】:

您正试图在一个类方法中使用 $session,该类方法只具有该方法的本地范围。

php 手册很好地介绍了这一点:http://php.net/manual/en/language.variables.scope.php

您可以做的是将 $session 初始化为全局变量,然后您可以从您的身份验证方法中访问它。

或者,您可以将 $session 作为参数传递给您的身份验证方法。

例如:

->authenticate($email,$password,$session);

【讨论】:

  • 我是个骨头。 PHP 以我不习惯的方式处理范围。我所需要的只是在我的函数中包含全局 $session 。我总是忘记一件简单的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
相关资源
最近更新 更多