如何通过在 PHP 中通过引用传递变量来存储变量?

Posted

技术标签:

【中文标题】如何通过在 PHP 中通过引用传递变量来存储变量?【英文标题】:How can I store a variable by passing it by reference in PHP? 【发布时间】:2019-06-05 20:14:43 【问题描述】:

我正在尝试理解为Conflict Resolution 引入 php 7+ 的 OOP 概念。我还想在我的设计中动态调用save(),这将接受by reference 的参数。

为了在我创建这个添加到我的框架之前测试这个概念,我想尝试简单地输出变量的 zval 的基础知识。

我现在的性格是这样的:

trait Singleton 
    # Holds Parent Instance
    private static  $_instance;
    # Holds Current zval
    private         $_arg;

    # No Direct Need For This Other Than Stopping Call To new Class
    private function __construct() 

    # Singleton Design
    public static function getInstance() 
        return self::$_instance ?? (self::$_instance = new self());
    

    # Store a reference of the variable to share the zval
    # If I set $row before I execute this method, and echo $arg
    # It holds the correct value, _arg is not saving this same value?
    public function bindArg(&$arg)  $this->_arg = $arg; 

    # Output the value of the stored reference if exists
    public function helloWorld()  echo $this->_arg ?? 'Did not exist.'; 

然后我创建了一个利用 Singleton trait 的类。

final class Test 
    use \Singleton  helloWorld as public peekabo; 

我像这样传递了我想引用的变量,因为该方法需要一个变量的引用——它还不需要设置。

Test::getInstance()->bindArg($row);

我现在想模仿从数据库结果中循环遍历行的概念,这个概念是允许将save() 方法添加到我的设计中,但首先要让基本概念发挥作用。

foreach(['Hello', ',', ' World'] as $row)
    Test::getInstance()->peekabo();

问题是,输出如下所示:

Did not exist.Did not exist.Did not exist.

我的预期输出如下所示:

Hello, World

如何将 zval 存储在我的类中以供以后在单独的方法中使用?


Demo for future viewers of this now working thanks to the answers

Demo of this working for a database concept like I explained in the question这里:

“我现在想模仿从数据库结果中循环遍历行的概念,这个概念是允许将 save() 方法添加到我的设计中”

【问题讨论】:

看起来您没有在 foreach 循环中调用 bindArg。所以 $_arg 没有被设置。 bindArg 应该只通过引用存储变量,因此只需要进行一次调用。随着$row 的值变化,peekabo() 应该输出$row 变化后的值,因为$this->_arg 应该保持相同的zval @RyDog \PDOStatement::bindParam 是我想要实现的目标的完美示例。因为PDOStatement::execute 保存值的zval(因此为什么可以在变量设置之前调用bindParam())只要它是在调用execute() 之前设置的。我希望这更有意义@RyDog 【参考方案1】:

使用public function bindArg(&$arg) $this->_arg = &$arg; 它适用于 PHP 7.3

【讨论】:

天哪,我假设因为 &$arg 被传入,$arg 将持有对变量的引用,而不是值。通过引用 $this->_arg 传递 $arg 现在可以工作了。这是供未来观众使用的demo。非常感谢! 如果有人对这种方法感兴趣,我在 MVC 中使用传递引用进行了解释。我已经将此测试实现为数据库模型。这是example 的外观。您只需要设置连接,就可以按照自己的喜好使用它。您可以动态保存数据、删除数据或任何您喜欢的方式。

以上是关于如何通过在 PHP 中通过引用传递变量来存储变量?的主要内容,如果未能解决你的问题,请参考以下文章

何时在 PHP 中通过引用传递

如何在php中通过引用传递无限参数[重复]

有人可以解释在 C++ 中通过指针传递和通过引用传递的目的是啥吗?

在 C# 中通过引用或值传递对象

如何在:Django 中通过 URL 传递带空格的变量

在 Javascript 中通过引用传递字符串