为了账号安全,请及时绑定邮箱和手机立即绑定

我可以将代码包含到PHP类中吗?

我可以将代码包含到PHP类中吗?

PHP
慕丝7291255 2019-08-17 15:55:57
我可以将代码包含到PHP类中吗?我想创建一个PHP类,比方说Myclass.php。现在在该类中我想要定义类本身和一些实例变量。但是所有方法都必须来自Myclass_methods.php文件。我可以将该文件包含在类体中吗?我有很好的理由为什么我要分开这个。简而言之,我将拥有一个后端,我可以在其中更改类的业务逻辑,而所有其他事情必须保持不变。系统为我维护所有ORM和其他东西。但是如果这是一个坏主意,那么在编辑业务逻辑之后重新生成整个类文件可能会更好(因此,在这种情况下是用户定义的方法)。性能问题:如果在一个请求中只包含一次Myclass.php,实际上Myclass_methods.php也应该只被包含一次。可能是错的。专家?
查看完整描述

3 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

不可以。您不能在课程正文中包含文件。
在定义类的文件中,您只能在方法体中类体外部包含文件。

从你的描述中我带你想要这个:

<?php // MyClass.phpclass MyClass{
    protected $_prop;
    include 'myclass-methods.php';}<?php // myclass-methods.phppublic function myMethod(){
   $this->$_prop = 1;}

运行此代码将导致

Parse error: syntax error, unexpected T_INCLUDE, expecting T_FUNCTION

虽然这是可能的

<?php // MyClass.phpclass MyClass{
    protected $_prop;
    public function __construct() // or any other method
    {
        include 'some-functions.php';
        foo($b); // echoes 'a';
    }}<?php // some-functions.php$b = 'a';function foo($str){
   echo $str;}

这样做会将include文件的内容导入方法范围,而不是类范围。您可以在包含文件中包含函数和变量,但不包括方法。您可以但不应该将整个脚本放入其中并更改方法的作用,例如

<?php // MyClass.php
    // ...
    public function __construct($someCondition)
    {
        // No No Code here
        include ($someCondition === 'whatever') ? 'whatever.php' : 'default.php';
    }
    // ...<?php // whatever.php
    echo 'whatever';<?php // default.php
    echo 'foo';

但是,以这种方式修补类以表现出不同的行为并不是你应该如何在OOP中完成它。这是完全错误的,应该让你的眼睛流血。

由于您希望动态更改行为,因此扩展类也不是一个好选择(请参阅下面的原因)。你真正想要做的是编写一个接口,让你的类使用实现这个接口的对象,从而确保适当的方法可用。这称为战略模式,其工作方式如下:

<?php // Meowing.php interface Meowing{
    public function meow();}

现在你得到了所有Meowing Behaviors必须遵守的合同,即采用喵喵方法。接下来定义一个Meowing行为:

<?php // RegularMeow.phpclass RegularMeow implements Meowing{
    public function meow()
    {
        return 'meow';
    }}

现在使用它,使用:

<?php // Cat.phpclass Cat{
    protected $_meowing;

    public function setMeowing(Meowing $meowing)
    {
        $this->_meowing = $meowing;
    }

    public function meow()
    {
        $this->_meowing->meow()
    }}

通过将Meowing TypeHint添加到setMeowing,可以确保传递的param实现了Meowing接口。让我们定义另一种喵喵行为:

<?php // LolkatMeow.phpclass LolkatMeow implements Meowing{
    public function meow()
    {
        return 'lolz xD';
    }}

现在,您可以轻松地交换这样的行为:

<?php
require_once 'Meowing.php';require_once 'RegularMeow.php';require_once 'LolkatMeow.php';require_once 'Cat.php';$cat = new Cat;$cat->setMeowing(new RegularMeow);echo $cat->meow; // outputs 'meow';// now to change the behavior$cat->setMeowing(new LolkatMeow);echo $cat->meow; // outputs 'lolz xD';

虽然你也可以通过定义一个抽象的 BaseCat和meow方法,然后从中派生出具体的RegularCat和Lolkat类来解决上面的继承问题,你必须考虑你想要实现的目标。如果你的猫永远不会改变它们的喵喵方式,那就继续使用继承,但是如果你的RegularCat和Lolkat应该能够做任意的喵喵,那么使用策略模式。


查看完整回答
反对 回复 2019-08-17
?
DIEA

TA贡献1820条经验 获得超2个赞

创建具有相关基本功能的核心类可能不是一个想法,然后使用所需的方法扩展它 - 这似乎是一种更合乎逻辑的方法。


查看完整回答
反对 回复 2019-08-17
  • 3 回答
  • 0 关注
  • 476 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信