我有一个 curl 处理程序,但将显示标准类型变量的示例。这里有两个类,我想分享一个从第一类到第二类的变量作为参考。
<?php
class first
{
private $a=10;
private $b='cos';
public function SendData()
{
$data = array(
'first' => &$this->a,
'second' => $this->b
);
return $data;
}
public function GetA() { return $this->a; }
public function GetB() { return $this->b; }
}
class second
{
private $a;
private $b;
public function __construct($data)
{
$this->a = $data['first'];
$this->b = $data['second'];
}
public function GetA() { return $this->a; }
public function GetB() { return $this->b; }
public function Change($i) { $this->a = $i; }
}
$f = new first();
$s = new second($f->SendData());
echo $f->GetA() . " " . $f->GetB() . PHP_EOL;
echo $s->GetA() . " " . $s->GetB() . PHP_EOL;
$s->Change(123);
echo $f->GetA() . " " . $f->GetB() . PHP_EOL;
echo $s->GetA() . " " . $s->GetB() . PHP_EOL;
?>
输出如下:
10 cos
10 cos
10 cos
123 cos
我的问题是 - 如何像 C 中的指针一样做到这一点,当我调用 second::Change($i) 函数时,我也想先更改::$a 值,所以输出会像:
10 cos
10 cos
123 cos
123 cos
你需要做的是创建一个通过引用返回的函数。您已经有一个函数first
返回$this->a
,但该函数返回值而不是引用。您可以通过在方法名称public function &GetA(
之前以及在脚本$a = &$first->GetA() //gets reference to $this->a in first
中调用方法之前放置一个&
来实现这一点。
但在此之前,您需要在second
类中获取first
类的实例。现在我们提到了这一点,您有三个选择:
- 将包含
first
实例的变量声明为全局
变量 - 将变量作为参数传递给
second::change()
- 首先创建一个单例类,该类始终返回相同的实例
最简单的方法是选项 1,尽管如果您做很多事情,我不建议这样做。选项 3 是最佳选择,如果可能,应始终这样做。选项 2 是您可以使用的选项,如果您没有数十个使用该类的文件,则可以轻松实现。
如果已实现second
first
实例的方法,则可以在second::change()
函数中通过引用获取变量,并将该变量更改为新值。
参考:
3v4l.org 简单的引用获取 https://3v4l.org/i6X5L
3v4l.org 类示例通过引用(使用全局)获取 https://3v4l.org/iL2Qf