【问题标题】:What is the proper way to create an object of another class in PHP?在 PHP 中创建另一个类的对象的正确方法是什么?
【发布时间】:2014-08-11 20:54:37
【问题描述】:

我有一个名为 emailUtility.php 的实用程序类,如下所示:

<?php
class emailUtility
{
    public function SendMail($subject,$body)
    {               

    }

}
?>

我还有两个类,我想在其中使用 emailUtility 类的这个 SendMail 方法。 我有使用 emailUtility 的头等舱(Test1.php),如下所示。

<?php
include("emailUtility.php")
class Test1
{
    $emailUtil=new emailUtility();
    $emailUtil->SendMail("","");
}

?>

现在,当我尝试以相同的方式在另一个类中使用相同的 emailUtility 类时,它不起作用。但是,当我从 Test1 中删除 emailUtility 的使用时,Test2 工作正常。 不工作意味着浏览时,同一文件中的其他部分代码也不会生成 HTML。

<?php
include("emailUtility.php")
class Test2
{
    $emailUtil=new emailUtility();
    $emailUtil->SendMail("","");
}

?>

如何在多个其他类中使用一个类? 另外,是不是一个类只能在php中包含一次?

【问题讨论】:

  • 使用include_once 而不是include。
  • 你的意思是在两个班级?

标签: php


【解决方案1】:

据我了解,您可能多次包含 emailUtility.php 文件,并且由于类被覆盖,它会导致您的程序崩溃。 只需替换下面的行

include("emailUtility.php");

与

include_once("emailUtility.php");

【讨论】:

    【解决方案2】:

    发生冲突的两个原因:

    1. 不能在 PHP 中重新声明类。通过使用include,您包含了两次脚本,因此类被声明了两次,因此出现了致命错误。

    2. 您忘记在类名中声明方法/变量。语法错误。

    尝试打开错误报告以查看实际错误而不是白页。在您的应用程序的最早期包含此行:error_reporting(E_ALL);。 Check doc here.

    解决方案

    1. 将include改为include_once。

      Differences:

      • include 将包含一个脚本,如果找不到脚本则显示警告
      • include_once 将只包含一次脚本,如果找不到脚本则显示警告
      • require 将包含一个脚本,并在找不到脚本时抛出致命错误
      • require_once 将包含一次脚本,并在找不到脚本时抛出致命错误


    2.声明你的Test1.php如下:

    Test1.php

    <?php
    include_once("emailUtility.php");
    class Test1 {
        /**
         * @var emailUtility
         */
        public $emailUtility;
    
        public function __construct() {
    
            //Note that we usually define class names as CamelCase "EmailUtility"
            //so it will be much more readable. For this case, ideal case should be
            //$this->emailUtility = new EmailUtility();
    
            $this->emailUtility = new emailUtility();
        }
    
        /**
         * My send email
         */
        public function mySendEmail() {
            $this->emailUtility->SendMail();
        }
    }
    

    Test2.php 应该遵循同样的声明。

    有一点需要注意,将类名定义为 CamelCase 始终是一个好习惯,例如,EmailUtility。它使代码更具可读性。

    【讨论】:

      猜你喜欢
      • 2015-05-22
      • 2016-04-24
      • 2012-06-01
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 2011-12-26
      相关资源
      最近更新 更多