草庐IT

php - 将 $db 对象传递给其他类,以便它们可以访问数据库

coder 2024-01-04 原文

我有一个 PHP 数据库类,它连接到 MySQL 并包装了所有 PDO 代码,我用它来查询数据库。基本上在页面 Controller 中我创建了一个新对象:

$db = new Database($dbConfig);

然后我可以像这样使用准备好的查询从数据库中获取数据:

$params = array('username' => $username);
$result = $db->preparedSelect('select password, salt from users where username = :username', $params);

它将 PDO 语句结果复制到一个新的关联数组中,并仅将数据库结果返回到调用页面。我像这样用一个简单的 foreach 遍历它们:

foreach ($result as $key => $val)
{
   $password = $val['password'];
   $salt = $val['salt'];
}

好吧,假设我想让另一个类使用我的 $db 对象,这样它就可以在某些方法中访问数据库。目前其他类看起来像这样:

class General
{
    // Database object
    private $db;

    public function __construct($db)
    {
        $this->db = $db;
    }
}

效果很好,但我只是想知道构造函数是否应该如下所示:

public function __construct(&$db)
{
    $this->db = $db;
}

这应该意味着我通过引用传递它,而不是将对象复制到另一个类中。我不想要类中的 $db 对象的副本,我希望它使用现有的数据库对象,这样我就不会有它的多个副本在耗尽内存。

在 PHP5 中将它作为 $db 或 &$db 传递有什么区别吗?通过一些阅读,PHP5 默认情况下通过引用传递对象,而其他人说它现在以 Java 方式进行,有些人说使用 & 会产生一个硬链接(hard link),不管它是什么。我很困惑。最好的方法是什么?

非常感谢!

最佳答案

有区别,但不是你想象的那样。

在PHP5中,“$db”持有一个对象,基本上等同于C或C++中的一个“Foo *”。换句话说,$db 不存储整个对象,它只存储一个小标记,让代码在必要时找到对象。当您按值传递此标记时,它与传递整数值一样快,而不是传递整个对象的副本。但是,如果您分配 $db,它不会更改调用者中的值,因为您正在更改保存 token 的局部变量以包含不同的 token 。

如果函数采用“&$db”,这基本上等同于在 C 中传递“Foo **”,或者更准确地说,函数采用 C++ 中的“Foo *&”。调用速度一样快,因为它是传递的相同大小的东西,但是如果你在函数内部分配给 $db 它将改变调用者中 $db 的值,因为“通过引用传递”变量指向你的内存在调用者中持有 token 的位置。

最好的方法是按值传递(不要使用“&”),除非您知道自己在做什么以及为什么要这样做。

关于php - 将 $db 对象传递给其他类,以便它们可以访问数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5208759/

有关php - 将 $db 对象传递给其他类,以便它们可以访问数据库的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  3. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  4. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  5. ruby-on-rails - Railstutorial : db:populate vs. 工厂女孩 - 2

    在railstutorial中,作者为什么选择使用这个(代码list10.25):http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-usersnamespace:dbdodesc"Filldatabasewithsampledata"task:populate=>:environmentdoRake::Task['db:reset'].invokeUser.create!(:name=>"ExampleUser",:email=>"example@railstutorial.org",:passwo

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  8. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  9. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  10. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

随机推荐