- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以创建一个在调用每个函数时自动调用的函数?我希望结果是这样的:
before_functions()
function_1()
before_functions()
function_2()
before_functions()
function_3()
但我想要一个具有以下功能的文件:
function before_functions(){} -> call before each function
还有另一个我调用函数的文件:
function_1()
function_2()
function_3()
但我不会在每个函数中调用before_functions
..
最佳答案
有不同的方法可以解决您的问题。其中一些已经在评论中提到了。让我们采用最简单的方法来解决您的问题。
魔法方法__call()
正如 lovelace 在评论中所说,对于您在 another stack overflow article 中所述的问题,已经有一个简单的解决方案。 .它使用 PHP 自己的魔术方法 __call()。让我们看一个简单的例子。
class Foo
{
protected function before() : void
{
echo "before";
}
public function after() : void
{
echo "after";
}
public function __call($method, $arguments)
{
if (method_exists($this, $method)) {
$this->before();
return call_user_func_array(array($this, $method), $arguments);
}
}
}
// Testing
$class = new Foo();
$class->after(); // echoes "before->after"
如您所见,魔术方法 __call
为您的目的提供了适当的处理。首先它检查被调用的方法是否存在,然后在执行被调用的方法之前执行 before
方法。 before
方法会在您调用存在的类方法时自动调用。
回调方法
正如评论中还提到的,回调函数可能是一种无需处理类实例的可能解决方案。让我们看一下回调示例。
$callback = function()
{
echo "before->";
}
function foo(callable $callback, $bla)
{
$callback();
echo $bla;
}
// example code
foo($callback, 'go and make some coffee');
// output: "before->go and make some coffee"
这种方法比使用 __call
方法更简单,因为您只需要一个可调用函数作为函数的参数。容易,嗯?
观察者模式
观察者模式是php5中标准php库自带的,比较复杂。我想对于您的用例来说太复杂了。为了保持完整,这里有一个简短的示例,说明观察者模式如何成为您问题的可用解决方案。
class Group implements SplSubject
{
/**
* persons in this group
* @var \SplObjectStorage
*/
protected $persons;
/**
* observer active in this group
* @var \SplObjectStorage
*/
protected $observers;
/**
* the person, which actually speaks
* @var Person
*/
protected $speaker;
/**
* Initializes our class members and sets an observer for this group
*/
public function __construct()
{
$this->persons = new \SplObjectStorage();
$this->observers = new \SplObjectStorage();
$onSpeakObserver = new OnSpeakObserver($who, $what);
$this->attach($onSpeakObserver);
}
public function add(Person $person) {
$this->persons->attach($person);
}
public function speak(Person $who, $what) {
echo $who . " says: " . $what . "<br>";
$this->speaker = $who;
$this->notify();
}
public function getSpeaker() {
return $this->speaker;
}
public function getGroup() {
return $this->persons;
}
public function attach(\SplObserver $observer) {
$this->observers->attach($observer);
}
public function detach(\SplObserver $observer) {
$this->observers->attach($observer);
}
public function notify() {
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
}
这是我们的基础类group
,应该遵守。应观察的类总是称为“主题”。一个主题接受一个或多个观察者,这些观察者由主题的 notify
方法调用。一个小组由几个人和一个演讲者组成。总是有一个说话者,其他人是听众,当说话者说些什么时,他们可以使用react。对于听众的 react ,我们需要一个观察者。如果说话者说了什么,这个观察者就会倾听。观察者直接在组的构造函数中添加。
这个类实现了\SplSubject
接口(interface),为我们带来了方法attach
、detach
和notify
处理观察者,我们附加到组中。接下来我们需要一个人和观察者本身的类。
class Person
{
protected $name = '';
public function __construct(string $name) : void
{
$this->name = $name;
}
public function __toString() : string
{
return $this->name;
}
}
一个有名字的简单人。
class OnSpeakObserver implements \SplObserver
{
public function update(\SplSubject $subject)
{
foreach ($subject->getGroup() as $person) {
if ($person !== $subject->getSpeaker()) {
echo $person . " says: me!<br>";
}
}
}
}
这是我们的观察者,它实现了原生的 \SplObserver
接口(interface),这迫使我们使用更新方法。每次当群组中有人发言时,都会调用此方法。
有了这些类,我们就有了一个简单的观察者模式。在这个简单的示例中,观察者会在群体中的某个人每次说某事时强制使用react。
// open a group (the subject, which is observed)
$friends = new Group();
// add some persons to our group
$sarah = new Person('Sarah');
$friends->add($sarah);
$nicole = new Person('Nicole');
$friends->add($nicole);
$marcel = new Person('Marcel');
$friends->add($marcel);
$steffen = new Person('Steffen');
$friends->add($steffen);
// Marcel says ...
$friends->speak($marcel, 'Who likes the observer pattern?');
// result:
// Marcel says: Who likes the observer pattern?
// Sarah says: me!
// Nicole says: me!
// Steffen says: me!
你可以转移这个小例子来解决你的问题。观察者可以监听您的函数的执行情况,并且每次调用您的一个函数时,观察者都可以先执行另一个函数。如本例所示,在一群人说了些什么之后,观察者只是执行。你的问题也一样。这完全取决于何时调用主题的通知方法。
如果您有任何问题,请随时提出。
关于php - 在每个函数之前调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54476354/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!