Php OOP:通过匿名函数将同一类中的方法获取到另一个方法
我是面向对象PHP新手,所以我不完全确定我的问题到底是什么,但问题是: 我创建了一个WordPress插件,它在另一个插件创建的某个自定义帖子类型上添加了一组元盒。在我的主题中,我需要得到所有的自定义元,但是需要得到的东西很多,通常带有某些条件等等。因此,我创建了一组帮助函数来简化它。问题是所有这些函数的名称都有点麻烦,所以我把它们放在插件中的一个类中以简化事情,我的问题是我在组合它们时遇到了困难。无论这是否可能,希望你能帮助 因此,大多数助手函数现在的类方法如下所示:Php OOP:通过匿名函数将同一类中的方法获取到另一个方法,php,class,oop,methods,Php,Class,Oop,Methods,我是面向对象PHP新手,所以我不完全确定我的问题到底是什么,但问题是: 我创建了一个WordPress插件,它在另一个插件创建的某个自定义帖子类型上添加了一组元盒。在我的主题中,我需要得到所有的自定义元,但是需要得到的东西很多,通常带有某些条件等等。因此,我创建了一组帮助函数来简化它。问题是所有这些函数的名称都有点麻烦,所以我把它们放在插件中的一个类中以简化事情,我的问题是我在组合它们时遇到了困难。无论这是否可能,希望你能帮助 因此,大多数助手函数现在的类方法如下所示: public funct
public function metabox_wrapper( $code ) {
$info = get_post_meta( ID, 'blah', true);
if ( $info ) {
code( $info );
}
}
然后在我的主题文件中,我使用:
global $Other_Plugins_Global // Created by the other plugin.
$class = new Class( $Other_Plugins_Global );
$class->metabox_wrapper( function( $info ) {
?>
<div>
<?php echo $info; ?>
</div>
<?php
});
但我尝试过的这一切都不起作用:
global $Other_Plugins_Global
$class = new Class( $Other_Plugins_Global );
$class->metabox_wrapper( function( $info ) {
?>
<div>
<?php echo $info; ?>
</div>
<?php
$class->other_metabox_wrapper( function( $stuff ) {
?>
<div>
<?php echo $stuff; ?>
</div>
<?php
});
});
所以我的问题是。。。有没有一种方法可以在彼此内部使用这些包装器函数?我尝试过将它们设置为静态,并使用::在主题中,我尝试过一些奇特的变量体操,但没有成功,如果成功的话,会很难看,我几乎让一个恶魔试图从方法内部调用全局变量。。。所以在这一点上,我甚至不知道谷歌应该做什么
显然,对于这个特殊的例子,我可以使用if{},但是条件逻辑通常有多个条件和其他半复杂的东西,所以保持这些条件的独立性并能够在主题周围的多个地方使用是很有帮助的
我会说,如果这是一个愚蠢的问题,你知道一个完全不同的更优雅的方式来完成我所描述的,那么我洗耳恭听
非常感谢您的帮助。首先,您必须阅读一些编码标准文章 1. 尝试将PHP代码和HTML分开;用细枝代替PHP使生活变得简单 如果有更多的帮助钩子函数,则可以更好地将它们分组到一个类中,或者创建一个Helper dir结构并为每个作用域创建一个文件。e、 g:修剪字符串,调整图像大小,创建不同的文件 创建帮助程序后,尽量不要将HTML放入其中;助手假定返回一个布尔值。 e、 g showCampaign=>将返回True; HTML页面/小枝页面 {{ifshowCampaign}} //HTML代码在这里 {{endif}} 如果需要重构的if/else语句太多,请检查上面的链接或其他示例: 祝你快乐
问题不在于OOP领域,而在于函数和函数范围领域。你看,当你创建一个变量时,它有自己的作用域——可以访问的变量的作用域。在大多数语言中,匿名函数包含创建它的作用域,创建一个-这意味着它可以访问父作用域中所有变量的副本。在PHP中,情况并非如此,因此为了从匿名函数中访问$class变量,应该使用:$class->metabox_包装函数$info使用$class{ 另一种方法是通过以下方式将上下文绑定到匿名函数: 然后可以在匿名函数中使用$this:
$class->metabox_wrapper(function($info) {
?>
<div>
<?php echo $info; ?>
</div>
<?php
$this->other_metabox_wrapper(function($stuff) {
?>
<div>
<?php echo $stuff; ?>
</div>
<?php
});
});
但说实话,我同意@CrisanLucian。以这种方式将代码与HTML混合在一起并不是最好的编程方式。感谢这些有趣的文章,但对我的问题并没有特别大的帮助,这就是我正在尝试干燥和简化我在主题中显示post meta的条件逻辑的使用。欢迎,事情就是这样当您完成任务并且代码正在执行假定的输出时。下一步是改进代码。以下最佳实践:1.将PHP与HTML分离2.使用DRY、KISS、重构IF/ELSE语句,将函数分组到类中,甚至在项目中创建更好的树结构以保持其干净和易于使用。y中的变量$code我们的第一个代码片段没有使用过,但有一个函数代码调用。打字错误?这很好,非常感谢!我同意这不是我想公开使用的东西,但这永远不会在我自己的项目之外发布或使用。因此,在这种情况下,它的非常规性并不困扰我——只要我理解它,并且它是有用的如果我的生活更轻松,我可以按照我的计划使用它。也就是说,你反对它是因为它不是最佳实践,还是因为它本身不安全或不安全?我不介意为了我自己的利益而使用一些不寻常的东西,但显然我也不想妥协。@Shoelace,我自己不是安全专家,所以我没有能力告诉你它是否安全。据我所知,它足够安全。问题是它很难阅读,也很难修改。我不知道WordPress,因此也不知道它的生态系统。如果这种编码风格在WordPress中是惯用的,那么,好吧,在罗马时,就像罗马人一样
public function metabox_wrapper($code) {
$info = get_post_meta(ID, 'blah', true);
if ($info) {
$code = Closure::bind($code, $this);
$code($info);
}
}
$class->metabox_wrapper(function($info) {
?>
<div>
<?php echo $info; ?>
</div>
<?php
$this->other_metabox_wrapper(function($stuff) {
?>
<div>
<?php echo $stuff; ?>
</div>
<?php
});
});