访问类方法/函数PHP

时间:2014-05-20 06:16:09

标签: php oop

我有一个 index.php 和一个 Regions.php 这是一个类。我正在尝试从Regions类调用一个方法到我的 index.php ,但似乎我无法访问它。它说:

Call to undefined function getRegionInfo() in C:\xampp\htdocs\exercise4\index.php on line 7

但我已经包含了我需要的文件。这是代码。

index.php

$regions = new Regions;
$regions = getRegionInfo();
$regions = get_regions();

这是我的Region类

class Regions
{

 public function getRegionInfo()
 {
    $this->get_regions();
 }

 private function get_regions()
 {
    global $db;
    $result = array();
    $sql  = "SELECT RegionID, RegionName, IslandID FROM ref_regions";
    $stmt = $db->prepare($sql);
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    while ($row = $stmt->fetch()) 
    {
      array_push($result,array($row['RegionID'], $row['RegionName'], $row['IslandID']));
    }     
    return $result;
 }

}

3 个答案:

答案 0 :(得分:3)

首先,正确的index.php看起来像这样:

$regionObj = new Regions();
$regions = $regionObj->getRegionInfo();

您需要表明您在getRegionInfo对象的特定实例(上例中的Regions)上调用$regionsObj函数。

其次,在这种情况下创建公共方法和私有方法没有意义。包含额外的私有方法是不必要的,因为所有公共方法都是调用私有方法。只需将所有代码放在公共方法中即可。你可能只有:

class Regions
{

 public function getRegionInfo()
 {
    global $db;
    $result = array();
    $sql  = "SELECT RegionID, RegionName, IslandID FROM ref_regions";
    $stmt = $db->prepare($sql);
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    while ($row = $stmt->fetch()) 
    {
      array_push($result,array($row['RegionID'], $row['RegionName'], $row['IslandID']));
    }     
    return $result;
 }

}

第三,你不应该让$db成为全局变量。而是将其作为参数发送到Regions类的构造函数:

class Regions
{

 private $database;

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

 public function getRegionInfo()
 {
    $result = array();
    $sql  = "SELECT RegionID, RegionName, IslandID FROM ref_regions";
    $stmt = $this->database->prepare($sql);
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    while ($row = $stmt->fetch()) 
    {
      array_push($result,array($row['RegionID'], $row['RegionName'], $row['IslandID']));
    }     
    return $result;
 }

}

然后像这样创建Regions对象:

$regionsObj = new Regions($db);

第四,您不需要自己填充结果数组。相反,您只需在fetchAll对象上返回$stmt函数的结果:

 public function getRegionInfo()
 {
    $sql  = "SELECT RegionID, RegionName, IslandID FROM ref_regions";
    $stmt = $this->database->prepare($sql);
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    return $stmt->fetchAll();
 }

您的最后一堂课,包含所有更改,将如下所示:

class Regions
{

 private $database;

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

 public function getRegionInfo()
 {
    $sql  = "SELECT RegionID, RegionName, IslandID FROM ref_regions";
    $stmt = $this->database->prepare($sql);
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    return $stmt->fetchAll();
 }

}

最后一点,我不确定你是否只是没有包含这部分代码,而且在另一个答案中提到了这一点,我将在此处包含它只是为了完整,请确保包括你的{在引用Regions.php类之前{1}}中的{1}}文件:

index.php

答案 1 :(得分:0)

使用->符号访问类方法。所以使用:

$regions = new Regions();
$regions->getRegionInfo();
$regions->get_regions();

如果您想在外部调用,请将get_regions()从私人更改为公开。

答案 2 :(得分:0)

这个怎么样..你需要先包含文件才能使用它

的index.php

include_once("Regions.php");

$regions = new Regions;
$x = $regions->getRegionInfo(); //this is temp var name