- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
基本上我有一个方法,我需要在构造函数完成时运行它(该方法称为 persist() 并且它只是将在构造函数期间生成的 key 保存到 session 中)。这看起来很简单,而且有效——在 __construct 的末尾,我调用了 $this->persist()。
问题是这个类被多次子类化了。这会导致两个问题。
第一,我必须记住在每个子类的 __construct 方法结束时调用 persist()。这不是一个大问题,但感觉不是很 OOP,我觉得我可以在父类中以某种方式处理这个问题,这样会更好。
第二,如果一个子类被子类化(它是),并且 __construct 方法被链接(即调用 parent::__construct),persist() 方法将被触发多次,每次类被子类化。当所有构造完成时,它只需要调用一次。在这种情况下,它并没有真正破坏任何东西,因为当第 2 次、第 3 次等调用 persist 方法时,它只是覆盖之前保留的内容。但这不是重点,因为我只是觉得必须有更好的方法,并且存在不允许多次调用该方法的场景。
构造对象然后调用持久化对象的工厂方法是唯一的方法吗?我可以沿着这条路走下去,但我只是想知道是否有一种方法可以做到这一点,以便始终在构造后调用来自父级的方法。
下面是一些示例代码:
session_start();
is(!isset($_SESSION["Component"])) $_SESSION["Component"] = [];
abstract Class Component
{
private $id;
protected $key;
function __construct($id = NULL)
{
$this->id = $id;
$this->key = [];
$this->key["something"] = "SomeValue";
$this->persist(); // First call
}
protected function persist()
{
if($this->id !== NULL) $_SESSION["Component"][$this->id] = $this->key;
}
}
Class SomeComponent extends Component
{
function __construct($id = NULL)
{
parent::__construct($id);
$this->key["something-else"] = "SomeOtherValue";
$this->persist(); // Second call
}
}
Class SomeSpecialistComponent extends SomeComponent
{
function __construct($id = NULL, $key = [])
{
parent::__construct($id);
$this->key = array_merge($this->key, $key);
$this->persist(); // Third call
}
}
$my_component = new SomeSpecialistComponent(1, ["example" => true]);
最佳答案
我发现获得类似东西的唯一技巧(除了我想在之前而不是之后执行事情)是使用带有抽象方法的父类作为新的构造函数:
abstract class RequireThings {
public function __construct() {
$this->constructAndPersist();
$this->persist();
}
abstract function constructAndPersist();
// You could also set this function in your children classes by the way.
public function persist() {
echo ' Then I persist!';
}
}
class UsingPersist extends RequireThings {
public function constructAndPersist() {
echo 'I do my things first.';
}
}
$class = new UsingPersist();
会输出:
我先做我的事情。那我坚持!
如果我答对了你的问题,应该足以避免你面临的问题。
此解决方案的主要缺点是您必须使用一个新函数,该函数应该是此类类的新构造函数。这就是我将 __constructPersist 设置为抽象的原因,它会强制执行所需的行为。
关于php - 在 __construct 完成后调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29145282/
我有一个这样的 PHP 类: class ParentClass { public function __construct($arg) { // Initialize a/s
什么时候调用__construct,什么时候调用index?还有其他区别吗? __construct 中要放什么?最好的做法是什么,我应该调用 $this->load 电话......?还有什么? c
我正在尝试为我的类(class)构建一个 __construct 函数。此函数应获取所有 $_REQUEST 值并将它们存储在一个数组中,以便以后可以通过 id 调用它们。问题是它不存储我的变量,我不
历史很少;我讨厌我不能在 CakePHP 中使用枚举,但我明白了。然而,我的另一个烦恼是我的 bool 值返回 0 或 1,并且没有办法将它们普遍地转换为"is"和“否”。 所以我想在 AppMode
如果我有: abstract class AbstractSingleton { protected static $instance; public static function
我在想你能不能帮我一下.. 我有两个类,一个扩展另一个。B 类将由各种不同的对象扩展并用于常见的数据库交互。现在我希望 B 类处理它的连接和断开连接,而无需来自 A 类或任何外部输入.. 据我了解,问
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: what is the function __construct used for? __construct
我已经注意到 __construct 很多与类。我做了一些阅读和网上冲浪,但找不到我能理解的解释。我只是从 OOP 开始。 我想知道是否有人可以大致了解它是什么,然后提供一个简单的例子来说明它是如何与
启用 MFA 时,Imagick 已实现生成二维码。尝试访问该页面以启用 MFA 时出现此错误: 500 ImagickPixel::__construct not implemented 这是更多信
所以我遇到了 PHP 类的“问题”。 我有几个类需要彼此的函数,所以目前我正在做以下事情: $db = new blueConnect; $core = new blueCore($db); $use
我目前在我的 PHP 类中使用构造函数来检查用户是否登录。构造函数调用一个函数来检查它们是否有 session ID 等——如果没有,它会将它们重定向到登录页面。这是我正在使用的想法: functio
我有一个模式Clients,那个用户的数据库表Clients Id | active ________________ 1 | true 2 | true 3 | false 我想更新这
我想知道我的理解是否正确。 我将数据库连接参数放在 __construct() 上,因此这意味着每次实例化该类时,我也会重新连接到我的数据库,对吗? private $handle; public f
我正在处理 oop class.php 文件。我想实现函数 __contruct()。我不知道为什么它不起作用。 我觉得有错误,但不知道怎么写。 $args['file_upload'] = $_FI
我正在使用 CI 3.X。现在在我的应用程序中我使用多个数据库。现在我的托管服务器允许最多 100 个连接,因此我的应用程序崩溃了。 在我的数据库配置中,我将 PCONNECT 保留为 FALSE 。
我有一个必须使用其他倍数对象实例化的 A 类 class A{ function __construct(new X(), new Y(), new Z()){ $this->foo
我在 __construct() 中定义了一个新变量,我想在这个 class 的另一个 function 中使用它。但是我的变量在另一个函数中是空的! 这是我的代码: class testObject
我知道有很多问题与此很接近。但是,我没有设法找到简单问题的答案(我不是在询问构造函数的返回值,我认为我理解构造函数应该返回什么)。 是否有任何理由避免在 __construct 中使用 return?
我有一个父类: Abstract Class Base { function __construct($registry) { // stuff } } 然后我至少有
基本上我有一个方法,我需要在构造函数完成时运行它(该方法称为 persist() 并且它只是将在构造函数期间生成的 key 保存到 session 中)。这看起来很简单,而且有效——在 __const
我是一名优秀的程序员,十分优秀!