Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Singleton创建单个MySQLi连接并跨多个对象使用它?_Php_Oop_Singleton_Mysqli - Fatal编程技术网

Php 使用Singleton创建单个MySQLi连接并跨多个对象使用它?

Php 使用Singleton创建单个MySQLi连接并跨多个对象使用它?,php,oop,singleton,mysqli,Php,Oop,Singleton,Mysqli,大家早上好 我对PHP并不完全陌生,但对于PHP5的OO还是有点陌生。现在,我想到了这个小项目,我想使用HTML5和一些OOPHP。它应该是一个水平滚动的时间表 因此,我创建了一个类时间线。这是我的主要目标。在其他方法中,一种方法($timeline->createYearString();)是创建我的年字符串。我实现了另一个类Year,方法创建了yearString();调用X次以创建我的年份的HTML输出 为了让我的岁月充满事实,我需要一个数据库连接。作为mysql连接oop方法的新手,我四

大家早上好

我对PHP并不完全陌生,但对于PHP5的OO还是有点陌生。现在,我想到了这个小项目,我想使用HTML5和一些OOPHP。它应该是一个水平滚动的时间表

因此,我创建了一个类时间线。这是我的主要目标。在其他方法中,一种方法($timeline->createYearString();)是创建我的年字符串。我实现了另一个类Year,方法创建了yearString();调用X次以创建我的年份的HTML输出

为了让我的岁月充满事实,我需要一个数据库连接。作为mysql连接oop方法的新手,我四处搜索并找到了Atli关于mysqli单例的注释()。我实现了它,并尝试在课程年的对象中使用它。有趣的是,第一个对象返回了$dbLink,但第二个对象没有返回,它是按照第一个对象的方式立即创建的$这个->db在第二年突然返回NULL,因此我从PHP得到一个非对象致命错误

见下面我的三节课。我错过了什么

class Year {
 private $year;
 private $db;

 function __construct($year) {
  $this->year=$year;
  $this->db=MyDB::Get();
 }

 function createHTML($last='') {
  $out=" <div class=\"year_outer".(($last) ? ' last_year' : '')."\" id=\"y".$this->year."\">
     <div class=\"year_inner\">
      <div class=\"year_above\">
       <span class=\"yearnr\">".$this->year."</span>
      </div>
      <div class=\"year_below\"></div>
     </div>
     <div class=\"months_wrapper\">\n";
  if(!$last) {
   for($i=1; $i<=12; $i++) {
    $fDoM = mktime(0,0,0,$i,1,$this->year);            // $fDoM = first Day of Month
    $lDoM = mktime(0,0,0,$i,date('t',mktime(0,0,0,$i,1,$this->year)),$this->year);  // $lDoM = last Day of Month
    $sql = $this->db->query("SELECT * FROM tp_together");
    //echo date('d.m.Y',$fDoM)." bis ".date('d.m.Y',$lDoM)."\n";

    $out.= " <div class=\"month_outer_l\" id=\"".$this->year."-".$i."\">
        <div class=\"month_outer_s\">
         <div class=\"month_inner\"><span>".date("M",mktime(0,0,0,$i,1,$this->year))."</span></div>
        </div>
       </div>\n";
    } 
  }  
  $out.= " </div>
    </div>\n";

  return $out;
 }
}

class Timeline {
 public $daysDating;
 public $startYear;
 public $endYear;
 public $numberOfYears;

 function __construct($start,$end='') {
  $this->startYear = $start;
  $this->endYear  = ($end=='') ? date("Y")+1 : $end;
  $this->daysDating = $this->calcDaysDating();
  $this->numberOfYears= $this->calcNumberOfYears();
 }

 function createYearString() {
  $x=new Year('2004');
  print $x->createHTML();
  $y=new Year('2005');
  print $y->createHTML();
  $z=new Year('2006');
  print $z->createHTML(true);

  // $j=$this->endYear;
  // for($i=$this->startYear; $i<=$j; $i++) {
  //  $x=new Year($i);
  //  ($i==$j) ?
  //   print $x->createHTML(true) :
  //   print $x->createHTML();
  // }
 }

 private function calcDaysDating() {
  $today=mktime(0,0,0,date("m"),date("d"),date("y"));
  $day1=mktime(0,0,0,7,11,2006);

  return $today-$day1;
 }

 private function calcNumberOfYears() {
  return $this->endYear - $this->startYear +1;
 }

 function createHNavigation() {
  $x=1;
  $out='<ul>';
  for($i=$this->startYear; $i<=$this->endYear; $i++) {
   $out.="<li><a class=\"navBubble\" id=\"navBubble$i\" accesskey=\"$x\" href=\"#y$i\" title=\"Go to $i\"></a></li>\n";
   $x++;
  }
  $out.="</ul>";
  return $out;
 }
}

class MyDB {
 private static $dbLink;

 private function __construct() {}
 private function __clone() {}

 public static function Get() {
  if(!self::$dbLink) {
   self::$dbLink = new mysqli(DB_HOST, DB_USER, DB_PWD, DB_NAME);
   if(mysqli_connect_errno()) {
    throw new Exception("Database connection failed: ".mysqli_connect_error());
   }
   return self::$dbLink;
  }
 }
}
学年{
私人每年$;
私人$db;
函数构造(年){
$this->year=$year;
$this->db=MyDB::Get();
}
函数createHTML($last=''){
$out=“年。”\“>
“$本->年。”
\n”;
如果(!$last){
对于($i=1;$iyear);//$fDoM=每月第一天
$lDoM=mktime(0,0,0,$i,日期('t',mktime(0,0,0,$i,1,$this->year)),$this->year);//$lDoM=月的最后一天
$sql=$this->db->query(“一起从tp_中选择*);
//回显日期('d.m.Y',$fDoM)。“bis”。日期('d.m.Y',$lDoM)。“\n”;
$out.=“年。”-“$i.\”>
.date(“M”,mktime(0,0,0,$i,1,$this->year))
\n”;
} 
}  
$out.=”
\n”;
退回$out;
}
}
班级时间表{
公费$daysDating;
公众$startYear;
年终公共开支$;
公费$numberOfYears;
函数构造($start,$end=''){
$this->startYear=$start;
$this->endYear=($end='')日期(“Y”)+1:$end;
$this->daysDating=$this->calcDaysDating();
$this->numberOfYears=$this->calcNumberOfYears();
}
函数createYearString(){
$x=新年('2004');
打印$x->createHTML();
$y=新年('2005');
打印$y->createHTML();
$z=新年('2006');
打印$z->createHTML(true);
//$j=$this->endYear;
//对于($i=$this->startYear;$icreateHTML(true):
//打印$x->createHTML();
// }
}
私有函数calcDaysDating(){
$today=mktime(0,0,0,日期(“m”)、日期(“d”)、日期(“y”);
$day1=mktime(0,0,0,7,112006);
返回$today-$day1;
}
私有函数计算年数(){
返回$this->endYear-$this->startYear+1;
}
函数createHNavigation(){
$x=1;
$out='
    '; 对于($i=$this->startYear;$iendYear;$i++){ $out.=“
  • \n”; $x++; } $out.=“
”; 退回$out; } } 类MyDB{ 私有静态$dbLink; 私有函数_构造(){} 私有函数uu clone(){} 公共静态函数Get(){ 如果(!self::$dbLink){ self::$dbLink=newmysqli(DB_主机、DB_用户、DB_PWD、DB_名称); if(mysqli\u connect\u errno()){ 抛出新异常(“数据库连接失败:”.mysqli_connect_error()); } 返回self::$dbLink; } } }
如果我没有把我的问题说清楚,$x类似于2004($x=新年('2004')),它工作得很好。但是随后,愚蠢的$y($y=新年('2005')返回致命错误,$this->db返回NULL-为什么


非常感谢,非常感谢您的帮助。

您的MyDB::Get函数在已设置的情况下不会返回self::$dbLink

原件返还:

public static function Get() {
    if(!self::$dbLink) {
        self::$dbLink = new mysqli(DB_HOST, DB_USER, DB_PWD, DB_NAME);
        if(mysqli_connect_errno()) {
            throw new Exception("Database connection failed: ".mysqli_connect_error());
        }
        return self::$dbLink;
     }
}
返回以使其工作:

public static function Get() {
    if(!self::$dbLink) {
        self::$dbLink = new mysqli(DB_HOST, DB_USER, DB_PWD, DB_NAME);
        if(mysqli_connect_errno()) {
            throw new Exception("Database connection failed: ".mysqli_connect_error());
        }
     }
     return self::$dbLink;
}

(请注意,使用多个字符作为缩进将更容易检测。)

最好使用
引用PHP字符串,以便使用
"
在您的HTML中。如果可以避免的话,转义狂欢是可怕的。在PHP中使用单例是毫无意义的。没有共享的应用程序内存。单例将仅在其自己的请求中是一个单例。三个同时发生的请求仍将创建三个实例。如果您想控制到数据库的连接数,它是这完全不是毫无意义的,你一开始处理事务就会发现这一点。当然。正如你所知,在处理事务时,你需要对所有查询使用相同的连接。如果你的查询被拆分为多个函数,你需要一种方法来访问每个函数中的MySQLi connection对象。你可以将对象设置为全局对象,您可以将其作为参数传递,也可以使用Singleton。每种方法都有其优缺点。我更喜欢Singleton。适合于正确工作的正确工具。在我的工作中,我非常依赖MySQL的特定功能,因此依赖此Singleton并不重要。它比全局对象有一个优势,即它不能是silen依赖注入?当然-只要你能用其他具有相同接口的对象替换MySQLi对象…嗯…知道吗?
public static function Get() {
  if(!self::$dbLink) {
  self::$dbLink = new mysqli(DB_HOST, DB_USER, DB_PWD, DB_NAME);
  if(mysqli_connect_errno()) {
   throw new Exception("Database connection failed: ".mysqli_connect_error());
  }
  //was here
  }
   return self::$dbLink; //should be here
 }