gpt4 book ai didi

php - 在 PHP 中创建和使用魔术方法

转载 作者:可可西里 更新时间:2023-11-01 00:30:30 24 4
gpt4 key购买 nike

我正在努力掌握 PHP 的神奇方法,为此我创建了一个如下所示的测试类:

<?php
class overload
{
protected $lastCalledParam;

public $param;

public function __construct()
{
return $this->switchConstruct(func_get_args());
}

protected function switchConstruct(array $args)
{
switch (count($args))
{
case 0:
return print "0 params<br />";
case 1:
return call_user_func_array(array($this, 'constr1'), $args);
case 2:
return call_user_func_array(array($this, 'constr2'), $args);
}
die("Invalid number of args");
}

protected function constr1($a)
{
print "constr1 called<br />";
}

protected function constr2($a, $b)
{
print "constr2 called<br />";
}

public function __get($name)
{
$this->lastCalledParam = $name;
return $this->{$name};
}

public function __set($name, $value)
{
$this->lastCalledParam = $name;
$this->{$name} = $value;
}

protected function lastCalled()
{
if (func_num_args() == 1)
{
$args = func_get_args();
$this->lastCalledParam = $args[0];
}
return $this->lastCalledParam;
}

public function __toString()
{
return $this->lastCalledParam == null ? "No data found" : $this->lastCalledParam;
}
}

这样调用:

<?php

require_once 'clib/overload.php';

$c = new overload();
print $c->__toString();
print "<br />";
$c->param = "Hello";
print $c->__toString();
?>

我期望的行为是在第一个 __toString() 调用中,会有:

0 params
No data found
Hello

但我得到的是:

0 params
No data found
No data found

我遇到了一个主要的症结所在,不明白为什么它没有设置 lastCalledParam 属性!

我总共收到了 0 个错误和 0 个警告,并且打开了完整的错误和警告报告,所以我不明白没有调用什么,在哪里/为什么。

最佳答案

__set 仅在无法正常到达参数时调用。你的 public $param 至少需要 protected 才能调用 __set

__set() is run when writing data to inaccessible properties.

http://php.net/manual/en/language.oop5.overloading.php#object.set (emphasis mine)

关于php - 在 PHP 中创建和使用魔术方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34679118/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com