我有3个文件
- class.myclass.php
- test1.php
- test2.php
class.myclass.php包含
class myclass
{
public $value;
function assign($input)
{
$this->value=$input;
}
function show()
{
echo $this->value;
}
}
$obj=new myclass();
test1.php包含
require("class.myclass.php");
$obj->assign(1);
$obj->show();
test2.php包含
require("class.myclass.php");
$obj->show();
在test2.php中$obj->show();
方法没有显示$obj->assign(1);
方法在test1.php中分配的值
我认为当我运行test2.php的对象$obj得到再次创建,所以分配的值离开。是否有办法保存对象的状态,以便我可以从其他php页面使用
非常感谢你的帮助。谢谢! !最简单的方法是将对象以序列化的形式保存在$_SESSION变量中,这样它就会在您的站点点击之间自动保存。
test1.php:
session_start();
require('class.myclass.php');
$obj->assign(1);
$_SESSION['myobj'] = serialize($obj);
test2.php:
session_start();
$obj = unserialize($_SESSION['myobj']);
$obj->show();
对于这样一个简单的对象,这就是所需要的。如果你的对象包含资源句柄(mysql连接,curl对象等),那么你需要一些额外的逻辑在那里处理恢复这些连接,当对象在反序列化时被恢复。
但是,您可能希望重新考虑在类文件中自动实例化您的对象,或者至少使其成为单例对象,这样您的类文件可以包含在多个地方,而不会在每次重新包含该文件时覆盖最后一次的$obj。
我在项目中使用的一种技术是创建一个好的类构造函数。我的意思是创建一个可以用单个参数重新创建相同对象的构造函数。
例如:class User {
public $email;
public $username;
public $DOB;
function __construct($input) {
// by providing a single input argument, we can re-create the object...
$this->email = $input;
$userData = $this->getUserData();
$this->username = $userData['username'];
$this->DOB = $userData['DOB'];
}
function getUserData() {
$email = $this->email;
$array = ["username" => "", "DOB" => ""];
// Database query/queries to get all user info for $email go here...
return $array;
}
}
现在您可以重新创建对象,如果您将$email存储为$_SESSION变量,例如:
file1.php
<?php
session_start();
$email = "hi@example.com";
$_SESSION['user'] = $email;
php
<?php
session_start();
include('User.class.php'); // this is the class example above
$email = $_SESSION['user'];
$userObject = new User($email);
// now you can access the object again as you need...
// for example:
$username = $userObject->username;
echo "Welcome back " . $username;