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

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

我想创建一个PHP类,比方说Myclass.php。现在在该类中我想要定义类本身和一些实例变量。但是所有方法都必须来自Myclass_methods.php文件。我可以将该文件包含在类体中吗?

我有很好的理由为什么我要分开这个。简而言之,我将拥有一个后端,我可以在其中更改类的业务逻辑,而所有其他事情必须保持不变。系统为我维护所有ORM和其他东西。

但是如果这是一个坏主意,那么在编辑业务逻辑之后重新生成整个类文件可能会更好(因此,在这种情况下是用户定义的方法)。

性能问题:如果在一个请求中只包含一次Myclass.php,实际上Myclass_methods.php也应该只被包含一次。可能是错的。专家?


慕丝7291255
浏览 477回答 3
3回答

慕码人2483693

不可以。您不能在课程正文中包含文件。在定义类的文件中,您只能在方法体中或类体外部包含文件。从你的描述中我带你想要这个:<?php&nbsp;//&nbsp;MyClass.phpclass&nbsp;MyClass{ &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$_prop; &nbsp;&nbsp;&nbsp;&nbsp;include&nbsp;'myclass-methods.php';}<?php&nbsp;//&nbsp;myclass-methods.phppublic&nbsp;function&nbsp;myMethod(){ &nbsp;&nbsp;&nbsp;$this->$_prop&nbsp;=&nbsp;1;}运行此代码将导致Parse&nbsp;error:&nbsp;syntax&nbsp;error,&nbsp;unexpected&nbsp;T_INCLUDE,&nbsp;expecting&nbsp;T_FUNCTION虽然这是可能的<?php&nbsp;//&nbsp;MyClass.phpclass&nbsp;MyClass{ &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$_prop; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;__construct()&nbsp;//&nbsp;or&nbsp;any&nbsp;other&nbsp;method &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include&nbsp;'some-functions.php'; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foo($b);&nbsp;//&nbsp;echoes&nbsp;'a'; &nbsp;&nbsp;&nbsp;&nbsp;}}<?php&nbsp;//&nbsp;some-functions.php$b&nbsp;=&nbsp;'a';function&nbsp;foo($str){ &nbsp;&nbsp;&nbsp;echo&nbsp;$str;}这样做会将include文件的内容导入方法范围,而不是类范围。您可以在包含文件中包含函数和变量,但不包括方法。您可以但不应该将整个脚本放入其中并更改方法的作用,例如<?php&nbsp;//&nbsp;MyClass.php &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;__construct($someCondition) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;No&nbsp;No&nbsp;Code&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include&nbsp;($someCondition&nbsp;===&nbsp;'whatever')&nbsp;?&nbsp;'whatever.php'&nbsp;:&nbsp;'default.php'; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;...<?php&nbsp;//&nbsp;whatever.php &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;'whatever';<?php&nbsp;//&nbsp;default.php &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;'foo';但是,以这种方式修补类以表现出不同的行为并不是你应该如何在OOP中完成它。这是完全错误的,应该让你的眼睛流血。由于您希望动态更改行为,因此扩展类也不是一个好选择(请参阅下面的原因)。你真正想要做的是编写一个接口,让你的类使用实现这个接口的对象,从而确保适当的方法可用。这称为战略模式,其工作方式如下:<?php&nbsp;//&nbsp;Meowing.php&nbsp;interface&nbsp;Meowing{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;meow();}现在你得到了所有Meowing Behaviors必须遵守的合同,即采用喵喵方法。接下来定义一个Meowing行为:<?php&nbsp;//&nbsp;RegularMeow.phpclass&nbsp;RegularMeow&nbsp;implements&nbsp;Meowing{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;meow() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;'meow'; &nbsp;&nbsp;&nbsp;&nbsp;}}现在使用它,使用:<?php&nbsp;//&nbsp;Cat.phpclass&nbsp;Cat{ &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$_meowing; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;setMeowing(Meowing&nbsp;$meowing) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->_meowing&nbsp;=&nbsp;$meowing; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;meow() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->_meowing->meow() &nbsp;&nbsp;&nbsp;&nbsp;}}通过将Meowing&nbsp;TypeHint添加到setMeowing,可以确保传递的param实现了Meowing接口。让我们定义另一种喵喵行为:<?php&nbsp;//&nbsp;LolkatMeow.phpclass&nbsp;LolkatMeow&nbsp;implements&nbsp;Meowing{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;meow() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;'lolz&nbsp;xD'; &nbsp;&nbsp;&nbsp;&nbsp;}}现在,您可以轻松地交换这样的行为:<?php require_once&nbsp;'Meowing.php';require_once&nbsp;'RegularMeow.php';require_once&nbsp;'LolkatMeow.php';require_once&nbsp;'Cat.php';$cat&nbsp;=&nbsp;new&nbsp;Cat;$cat->setMeowing(new&nbsp;RegularMeow);echo&nbsp;$cat->meow;&nbsp;//&nbsp;outputs&nbsp;'meow';//&nbsp;now&nbsp;to&nbsp;change&nbsp;the&nbsp;behavior$cat->setMeowing(new&nbsp;LolkatMeow);echo&nbsp;$cat->meow;&nbsp;//&nbsp;outputs&nbsp;'lolz&nbsp;xD';虽然你也可以通过定义一个抽象的&nbsp;BaseCat和meow方法,然后从中派生出具体的RegularCat和Lolkat类来解决上面的继承问题,你必须考虑你想要实现的目标。如果你的猫永远不会改变它们的喵喵方式,那就继续使用继承,但是如果你的RegularCat和Lolkat应该能够做任意的喵喵,那么使用策略模式。

DIEA

创建具有相关基本功能的核心类可能不是一个想法,然后使用所需的方法扩展它 - 这似乎是一种更合乎逻辑的方法。
打开App,查看更多内容
随时随地看视频慕课网APP