PHP:调用另一个类的方法

43

我仍在学习面向对象编程,所以这可能不可能实现(虽然如果是这样的话我会感到惊讶),我需要一些帮助来调用另一个类的方法。

例如,在ClassA I中有这个方法:

function getName()
{
    return $this->name;
}

现在我想从 ClassB(不同的文件,但在同一个目录中)调用 ClassAgetName() 方法,我该怎么做呢?我尝试了使用 include() ,但那样并不起作用。

谢谢!


请分享你正在使用的调用getName()函数的代码。 - Evert
类B是否与类A有任何关系(例如层次结构)?如果是这样,类B可以扩展类A,您将可以访问类A的函数。如果没有,请稍微描述一下您的两个对象(它们代表什么)。 - Mike
问题是,Class A已经扩展了另一个类(我从网络上下载的simple_html_dom),所以我不想(甚至不知道是否可以)再扩展Class A,因为它已经扩展了其他类。 - Ryan
@evert,我没有任何代码……我希望有人能给我一些代码来完成我上面写的内容,因为我卡住了。 - Ryan
4个回答

96
//file1.php
<?php

class ClassA
{
   private $name = 'John';

   function getName()
   {
     return $this->name;
   }   
}
?>

//file2.php
<?php
   include ("file1.php");

   class ClassB
   {

     function __construct()
     {
     }

     function callA()
     {
       $classA = new ClassA();
       $name = $classA->getName();
       echo $name;    //Prints John
     }
   }

   $classb = new ClassB();
   $classb->callA();
?>

4
请注意,由于您已将 B 类与 A 类密切耦合,因此现在无法轻松地对 B 类进行单元测试。 - PeeHaa
1
正确-应该将包括A的内容放在一个控制文件中,该文件调用A和B而不是B包含A。在这个例子中,每次加载B时都会实例化A。但是,对于您来说分离应该很容易。 - Kai Qing
1
那是另一课,OP将在另一天学习...现在OP所需要的只是基础知识。无论如何,感谢您指出这一点。 - codingbiz
1
我认为最好学习正确的方法,而不是从错误的角度开始。 - PeeHaa
require_once 的路径在哪里?我有这样的情况,我推送一个对象数据,并且我将上传类分开。我该如何调用这两个?如果我 require_once[]..... /dbConnect.php - RoCkDevstack
显示剩余3条评论

21

如果它们是不同的类,你可以像下面这样做:

class A
{
    private $name;

    public function __construct()
    {
        $this->name = 'Some Name';
    }

    public function getName()
    {
        return $this->name;
    }
}

class B
{
    private $a;

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

    function getNameOfA()
    {
        return $this->a->getName();
    }
}

$a = new A();
$b = new B($a);

$b->getNameOfA();
我在这个例子中做的是首先创建一个新的 A 类实例。然后我创建了一个新的 B 类实例,并将 A 类的实例传递到构造函数中。现在,B 可以使用 $this->a 访问所有 A 类的公共成员。
另外请注意,我没有在 B 类中实例化 A 类,因为这意味着两个类之间紧密耦合。这使得以下操作变得困难:
1. 对你的 B 类进行单元测试 2. 替换 A 类为另一个类

这个也不错,但你指定了两个不同的文件。所以你只需要记得在“new B()”等中包含想要实例化的类即可。 - Kai Qing
我更多地理解这个问题是如何访问另一个类的成员,而不是如何包含一个文件,但是没错,你是正确的。虽然自动加载文件对于方便起见是每个人都应该做的事情。 - PeeHaa
当然。不过在这个阶段,我认为自动加载可能会过载学习过程...也许。 - Kai Qing

11
您需要在ClassB中拥有ClassA的一个实例,或者让ClassB继承ClassA。
class ClassA {
    public function getName() {
      echo $this->name;
    }
}

class ClassB extends ClassA {
    public function getName() {
      parent::getName();
    }
}

如果没有继承或实例方法,您需要让ClassA拥有一个静态方法。

class ClassA {
  public static function getName() {
    echo "Rawkode";
  }
}

--- 其他文件 ---

echo ClassA::getName();

如果您只想从类的实例调用该方法:

class ClassA {
  public function getName() {
    echo "Rawkode";
  }
}

--- 其他文件 ---

$a = new ClassA();
echo $a->getName();

无论您选择哪种解决方案,都需要require 'ClassA.php'


1
ClassA::getName(); 是一种魅力。 - rickibarnes

0

文件1

class ClassA {

    public $name = 'A';

    public function getName(){
        return $this->name;
    }

}

文件2

include("file1.php");
class ClassB {

    public $name = 'B';

    public function getName(){
        return $this->name;
    }

    public function callA(){
        $a = new ClassA();
        return $a->getName();
    }

    public static function callAStatic(){
        $a = new ClassA();
        return $a->getName();
    }

}

$b = new ClassB();
echo $b->callA();
echo $b->getName();
echo ClassB::callAStatic();

请查看@codingbiz答案下的我的评论 - PeeHaa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接