【问题标题】:PHP: Calling another class' methodPHP:调用另一个类的方法
【发布时间】:2012-11-21 23:29:00
【问题描述】:

我仍在学习 OOP,所以这甚至可能是不可能的(尽管如果是这样我会感到惊讶),我需要一些帮助来调用另一个类方法。

例如在ClassA I有这个方法:

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

现在从ClassB(不同的文件,但在同一个目录),我想调用ClassAgetName(),我该怎么做?我试图只做一个include(),但这不起作用。

谢谢!

【问题讨论】:

  • 分享你用来调用getName()的代码
  • B 类与 A 类有关系吗(比如分层)?如果是这样,B 类可以扩展 A 类,您将可以访问 A 类的功能。如果不是,您能否再描述一下您的两个对象(它们代表什么)。
  • 问题是,A 类已经在扩展另一个类(我从网上下载的 simple_html_dom)所以我不想(甚至不知道我是否可以)扩展已经在扩展其他一些的 A 类类
  • @evert,我没有任何代码...我希望有人能给我一些代码来做我上面写的事情,因为我被卡住了。

标签: php oop


【解决方案1】:
//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();
?>

【讨论】:

  • 这是你想要的,尽管它目前是否定的。
  • 请注意,您现在无法轻松地对 B 类进行单元测试,因为您已与 A 类紧密耦合。
  • 对 - 包含可能应该在一个控制文件中,该文件同时调用 A 和 B 而不是 B 包括 A。在此示例中,您将始终在加载 B 时实例化 A。但这应该很容易让你分开。
  • 这是 OP 改天学习的另一课……现在所有 OP 需要的是基础知识。感谢您指出这一点
  • 学习正确的方法比从错误的脚开始更好。
【解决方案2】:

如果它们是单独的类,您可以执行以下操作:

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-&gt;a 访问A 类的所有公共成员。

还要注意,我没有在 B 类中实例化 A 类,因为这意味着我将这两个类紧密结合。这使得很难:

  1. B 类进行单元测试
  2. A 类替换为另一个类

【讨论】:

  • 这个也不错,但是你指定了两个不同的文件。所以你只需要记住包含你想用“new B()”等实例化的类
  • 我更多地阅读这个问题,因为我如何访问另一个类的成员而不是如何包含文件,但是你是对的。尽管自动加载文件是每个人都应该为方便而做的事情。
  • 是的。虽然在这个阶段我认为自动加载可能会使学习过程超载......也许。
【解决方案3】:

您需要在 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

【讨论】:

  • ClassA::getName(); 是魅力。
【解决方案4】:

文件 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();

【讨论】:

猜你喜欢
  • 2011-01-14
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 2016-10-12
  • 1970-01-01
相关资源
最近更新 更多