【问题标题】:Is it allowed to use procedural functions inside OOP PHP methods?是否允许在 OOP PHP 方法中使用过程函数?
【发布时间】:2015-08-23 15:51:58
【问题描述】:

我正在学习面向对象的 PHP,我想知道是否允许在方法中使用过程函数。

例如,在WordPress 中,您有一个函数get_option(); 从选项数据库表中按名称获取值。是否允许这样做:

class ExampleClass {

   public static function ExampleMethod( $optionName ) {
      if( get_option( $optionName ) ) {
         return get_option( $optionName ) + 20;
      }     
   }

}

【问题讨论】:

  • 举个简单的例子:当你不允许在类中使用像strlen()这样的函数时,你将如何获得字符串的长度?所以是的它确实有效,是的,它是允许的,是的,它也被使用了。
  • 这是我的想法,但我需要确认。感谢您的回答!
  • 不客气 :) 还要在这里注意这一点:如果您使用命名空间,则必须小心:namespace I_AM_A_NAMESPACE; function strlen() { echo "nope"; } echo strlen("xyz"); echo \strlen("xyz"); 第一个函数调用将打印“nope”,第二个函数调用将打印“3”

标签: php wordpress function oop methods


【解决方案1】:

是否允许在 OOP PHP 方法中使用过程函数?

嗯,第一个问题是它是否可能。我们为什么不尝试一下:

class A {

    public static function randomStaticMethod() {
        echo "Function call:" . phpversion();
    }

    public function randomMethod() {
        echo "Function call:" . phpversion();
    }

}

$o = new A();
$o->randomMethod();

A::randomStaticMethod();

你会看到它会按预期工作,没有错误没有警告,只是:

Function call: ...
Function call: ...

所以这绝对是可能的。现在回答您的问题:是否允许?

简单的问题,应该可以回答您的问题:

如果不允许在类中使用 strlen() 之类的函数,如何获取字符串的长度?

所以是的,它也绝对是允许和使用的。


现在还有一些其他的事情,知道这些可能会有用。如果您使用命名空间,则必须小心。

例如:

namespace I_AM_A_NAMESPACE;

function strlen() {
    echo "nope";
}

echo strlen("xyz");
echo \strlen("xyz");

您的输出将是:

nope
3

因此,如果您使用命名空间,则必须知道您在哪个命名空间中以及要调用哪个函数。所以如果你想调用全局函数strlen()并且你想走保存路线,总是在它前面放一个\,以确保你调用了全局strlen()函数。

【讨论】:

    【解决方案2】:

    您可以使用下面的代码完全静态化。我只是使用数字 1 作为参数,并使用 Return 1 作为示例代码,因此可以返回一些东西。我个人建议动态分配对象,尤其是在您的系统内存有限的情况下,但这是我的代码:

    <?php
    echo ExampleClass::ExampleMethod(1);
    exit();
    
    class ExampleClass {
    
    public static function get_option( $optionName ) {
        //do processing here
    return 1;
    }
    
    public static function ExampleMethod( $optionName ) {
    if( ExampleClass::get_option( $optionName ) ) {
        return ExampleClass::get_option( $optionName ) + 20;
    }
    }
    
    }
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多