PHP-OOP 扩展两个类?

2024-04-24

我是 OOP 的初学者,现在我正在尝试编写一些 PHP 类来连接 FTP 服务器。

class ftpConnect {
  private $server;
  private $user;
  private $password;

  private $connection_id;
  private $connection_correct = false;

  public function __construct($server, $user = "anonymous", $password = "[email protected] /cdn-cgi/l/email-protection") {

    $this->server   = $server;
    $this->user     = $user;
    $this->password = $password;

    $this->connection_id      = ftp_connect($this->server);
    $this->connection_correct = ftp_login($this->connection_id, $this->user, $this->password);

    if ( (!$this->connection_id) || (!$this->connection_correct) ){
        echo "Error! Couldn't connect to $this->server";
        var_dump($this->connection_id);
        var_dump($this->connection_correct);
        return false;
    } else {
        echo "Successfully connected to $this->server, user: $this->user";
        $this->connection_correct = true;
        return true;
    }
  }
}

我认为目前班级的规模是微不足道的。

主要问题是我在理解 OOP 思想方面存在一些问题。

我想在每次运行代码时添加发送电子邮件。我已经下载了PHPMailer类 http://code.google.com/a/apache-extras.org/p/phpmailer/并用它扩展了我的课程:

class ftpConnect extends PHPMailer {...}

我添加了一些变量和方法,并且一切都按预期进行。

我想:为什么不添加将所有内容存储在数据库中。每次用户运行上述代码时,正确的信息都应该存储在数据库中。

我可以编辑我的ftpConnect class并添加数据库连接到构造函数,以及其他一些更新表的方法。但是数据库连接和所有这些东西将来可能会被其他类使用,所以它绝对应该在单独的类中实现。 但我的“主要”ftpConnect class已经扩展了一类,不能再扩展一类了。

我不知道如何解决这个问题。也许我的ftpConnect class太复杂了,我应该以某种方式将它分成几个较小的类? 任何帮助深表感谢。


首先,我认为你的班级存在设计缺陷。你的构造函数正在工作。这不是构造函数在正确的 OOP 中应该做的事情。您的构造函数应该只设置属性,并且您应该有一个单独的方法connect().

Second ftpConnect永远不应该延长PHPMailer。它们是两个完全不同的东西。阅读有关里氏替换原则 http://en.wikipedia.org/wiki/Liskov_substitution_principle它是的一部分坚实的原则 http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29.

如果您的类需要对数据库执行某些操作或需要发送邮件,您需要将这些实例注入到您的类中而不是扩展它们。这就是所谓的依赖注入 http://en.wikipedia.org/wiki/Dependency_injection这将使稍后进行单元测试变得容易,因为您可以轻松使用模拟邮件程序类或模拟数据库类。

如果您想发送邮件、访问数据库并使用 FTP,您将需要至少 3 个不同的(独立的)类(可能需要更多的类来对数据库等进行一些映射)。基本上每个班级都应该有一种责任,而且只有一种责任。这被称为单一职责原则 http://en.wikipedia.org/wiki/Single_responsibility_principle.

对于一些一般参考,请参阅:

  • 指南:编写可测试代码 http://misko.hevery.com/code-reviewers-guide/
  • 谷歌清洁代码讲座 http://www.g-truc.net/post-0182.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP-OOP 扩展两个类? 的相关文章

  • 在单个测试中断言多个条件,还是分成多个测试? [复制]

    这个问题在这里已经有答案了 如果您正在测试如下所示的计数函数 那么在一个函数中测试该函数的多项内容与为每个测试使用一个测试函数相比 是否被认为是 正确 或 错误 function testGetKeywordCount tester thi
  • 在 CakePHP 中访问 Configuration::read 控制器

    我的 CakePHP 应用程序有一个单独的配置文件 该文件加载在 bootstrap php 中 我的问题是 如何访问控制器中的配置变量 IE 如何在控制器中执行Configure read variable 函数 谢谢 在我的自定义配置文
  • mysql 查询从给定的表结构创建 SEO 友好的 url

    我正在尝试使用下表创建 SEO 友好的 URL 类别表 http sqlfiddle com 2 c474a 4 页表 http sqlfiddle com 2 c474a 5 我正在尝试编写一个 mysql 查询 该查询将使用产生以下输出
  • 检查 2 个数组是否至少有 1 个相等的值 [重复]

    这个问题在这里已经有答案了 目前我有2个数组 array 1 2 3 4 array 4 5 6 7 我如何检查它们是否至少有一个相等的值 上面的示例有 1 个相等值 gt 4 因此该函数应返回 true 数组相交 http php net
  • 在 PHPUnit 中实现给定接口的模拟对象上未定义方法?

    我是单元测试和 PHPUnit 的新手 我需要一个模拟 我可以完全控制它 实现ConfigurationInterface界面 测试对象是ReportEventParamConverter对象和测试必须检查我的对象和界面之间的交互 Repo
  • SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 laravel 9

    尝试分配外键 但是当您运行迁移时 我收到此错误 我不明白问题是什么 SQLSTATE HY000 一般错误 1215 无法添加外键约束 SQL alter tablecategories添加约束categories parent key f
  • 可能的 PDOException 错误(MySQL 5)?

    因此 我正在为我的网络应用程序设置一个安装程序 并具有数据库凭据的输入字段 我的验证过程的一部分包括测试数据库连接 使用 PHP 的 PDO 库 如果连接失败 我希望能够区分错误的密码 错误的地址 不存在的数据库名称等 以便我可以引用表单上
  • Faker 生成奇怪的电话号码?

    因此 我使用 Laravel 创建一个数据库并对其进行播种 我遇到了一个问题 它生成一个电话号码 如下所示 635 889 5802 x45134 这会因超出数据库列的所需长度而导致问题 所以我的问题是 从实践层面来看 它为什么这样做 现实
  • jQuery - 找不到 ajax url

    好吧 我确信这真的很容易 而且我很愚蠢 但似乎无法弄清楚它的真相 我正在尝试从名为 custom js 的 js 文件对 helpers php 中的某些代码进行简单的 AJAX 调用 然而 我不断收到 404 错误 因为我似乎没有正确遍历
  • PHP:查找所有以“:”开头的单词

    你能帮我用 PHP 函数 正则表达式在给定的文本中找到所有以字符 开头的单词吗 换句话说 所有以 开头并用 空格 分隔的子字符串 Since word应该可能是有效的 我想 word another应该算两个词 那么你就不能说总有一个空格
  • 迭代亚马逊S3上文件夹中的对象

    我们有一个应用程序 用户可以创建自己的网页并托管它们 我们使用 S3 来存储静态页面 在这里 由于我们每个用户有 100 个存储桶的限制 我们决定为每个用户使用文件夹桶内的用户 现在 如果用户想在他的域上托管他的网站 我们会向他询问域名 当
  • 在 Yii 2.0 中添加 jquery

    如何在 Yii 2 0 中将 jQuery 添加到我的页面 在 Yii 1 x 中你可以使用 Yii app gt clientScript gt registerCoreScript jquery 我已经尝试用自己的 View 类重写并尝
  • 使用列模数的更简洁方法

    我目前有一个人员列表 我已将其分为两列 但在完成代码后 我一直想知道是否有更有效或更干净的方法来完成同样的事情 echo table class area list tr Loop users within areas divided up
  • 如何将javascript变量放入php echo [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想将 JavaScript 变量添
  • .htaccess 只允许访问包含文件

    我的网站上有各种子文件夹 我希望用户无法通过 URL 访问它们 但同时我的主要 PHP 文件能够包含它们或将它们用作表单或链接上的操作 我尝试使用 htaccess 与
  • time() 会返回相同的输出吗?

    当用户注册时 我正在为 PHP 中的用户生成令牌 我想知道两个用户是否可以获得相同的令牌 因为这会破坏系统 请让我知道这是否足够 token md5 rand time 编辑 我现在正在使用我在另一个问题上找到的generate uuid
  • PHP:调用 __call 而不是 __callStatic

    我正在开发一个自定义 ORM 这里有一个简化的示例来演示该问题 class Foo public static function callStatic name args if name getBar return Bar return N
  • UserDict 类的优点?

    使用有什么好处UserDict class 我的意思是 我真正得到的不是 class MyClass object def init self self a 0 self b 0 m MyClass m a 5 m b 7 我将写下以下内容
  • 单击时获取按钮值并回显它

    我是 php 的初学者 我的第一个任务是构建一个计算器 我在这里询问如何从按钮获取值并在同一页面上回显它 我正在尝试使用 isset 通过方法发布 但能够在同一页面上显示任何值
  • SalesForce.com:通过 PHP 检索自定义字段

    我在 SalesForce DE 站点中创建了一个简单的自定义联系人对象 API 名称为 Contact c 该对象有一个 Full Name c 字段 用于测试连接 然后我尝试通过 PHP 检索所有联系人 特别是此字段 try mySfo

随机推荐