-1

假设我有一个名为的类product,它有 2 个属性,pid并且quantity. 现在,我想创建一个包含此类数组的会话。代码示例:

<?php
public class product{
    public $quantity;
    public $pid;
    public function __construct($pid,$qty){
        $this->$pid = $pid;
        $this->$quantity = $qty;
    }
    // some methods ....
}
session_start();
$_SESSION['products'][] = new product(103,10);
$_SESSION['products'][] = new product(87,6);

?>

关于这个的几个问题:

  1. 我声明会话的方式是否正确?我没有输入类似$_SESSION['product'] = new array();我已经添加对象的东西。

  2. 当我想阅读 sessionproduct时,我是否必须将类导入product页面才能阅读并获得对quantitypid属性的访问权限?代码示例:

    session_start();
    echo $_SESSION['products'][0]->$pid; // should echo "103" (according the the code exmaple above)
    // OR I will have to do it like this:
    require_once 'product.inc.php';
    session_start();
    echo $_SESSION['products'][0]->$pid; // should echo "103" 
    

3.当我访问一个public属性时,我是否必须像这样访问它:$this->$prop_name或者$this -> prop_name(区别在于 $ 符号)

4

2 回答 2

1
  1. 如果你定义一个像 $var = array(); 这样的变量 它将擦除前一个数组。

  2. 会话在整个域/子域中都可用,只要您在访问会话变量之前调用了 session_start() 就可以了。

  3. 当您说公共财产时,您指的是类还是方法?如果你想访问自身内部的方法来引用它,比如 $this->myFunction = $object; 如果您想在其外部但在类内部访问该方法,您可以使用 SELF::$object = new myFunction();

看到这个:何时使用 self 而不是 $this? 这: http: //php.net/manual/en/language.oop5.php

希望这可以帮助。

于 2013-09-26T17:03:12.773 回答
1
  1. 我声明会话的方式是否正确?

是的。执行后session_start(),$_SESSION 数组将存在并填充数据(如果之前已保存)。

  1. 当我想阅读会话产品时,我是否必须将类产品导入页面才能阅读并访问数量和 pid 属性?

是的,如果您有方法,则需要声明类才能使用它们。

有一种更好的方法可以让课程脱水和补水。即serialize()unserialize()。它处理所有公共、受保护和私有数据,还存储类名。它当然不保存方法。

这是一些使用您的原始示例作为起点的示例代码。您可以在浏览器中运行它以查看结果

文件 product.class.php

<?php
class product{
    public $quantity;
    public $pid;
    private $a = 99;
    protected $b = 88;

    public function __construct($p,$q){
        $this->pid = $p;
        $this->quantity = $q;
    }
    public function show() {
        echo '<pre>SHOW '. $this->pid . '</pre>';
    }
}
?>

文件 tst99.php

require_once( 'product.class.php' );

session_start();

$p1 = new product(103,10);
$p2 = new product(87,6);

unset( $_SESSION['products'] );

$_SESSION['products'][] = serialize($p1);
$_SESSION['products'][] = serialize($p2);
echo 'Dehydrated class'.PHP_EOL;

echo '<pre>' . print_r( $_SESSION, TRUE ) . '</pre>';
?>

文件 tst99a.php

<?php
session_start();
require_once('product.class.php');
echo '<pre>' . print_r( $_SESSION, TRUE ) . '</pre>';

echo 'Rehydrated class'.PHP_EOL;
$np1 = unserialize($_SESSION['products'][0]);
$np2 = unserialize($_SESSION['products'][1]);

echo '<pre>' . print_r( $np1, TRUE ) . '</pre>';
echo '<pre>' . print_r( $np2, TRUE ) . '</pre>';
$np1->show();
$np2->show();

首先运行 tst99.php,然后运行 ​​tst99a.php 以查看该类是否已完全补水。

于 2013-09-26T18:46:35.927 回答