4

我为我的 wordpress 主题创建了一堆函数。我正在考虑将所有功能放在一个类中。这样我就可以使用以下方法调用它:

<?php $foo->function() ;?>

我想知道如果我把我的函数放在 php 类中那么它会导致任何问题吗???请注意我在我的函数中使用 WordPress 函数。

更新

class foo{
    function js($files){
        $css    =   array($files);
        foreach($css as $style){
            wp_enqueue_script($style, get_template_directory_uri() . '/js/'.$style, array(), '', true );
        }

    }
}
$foo = new foo();

当我直接调用它时效果很好:

$foo->js('bootstrap-transition.js,bootstrap-modal.js,bootstrap-dropdown.js');

但是当我把它称为 insde 另一个这样的函数时:

function assets(){
    $foo->js('bootstrap-transition.js,bootstrap-modal.js,bootstrap-dropdown.js');
}

然后它显示Call to a member function on a non-object错误

4

3 回答 3

12

对于那些还不熟悉这些概念的人,这里是关于 PHP 中面向对象编程的基本入门。对象是容器。它们包含代表单个抽象实体的定义函数和变量。面向对象编程的这一特性称为封装。这意味着单个胶囊可能包含旨在协同工作的多个函数和变量的定义。

例如,如果您想操作在电子商务网站上销售的产品,您可以拥有一个代表该产品的对象。它可能包含一些定义产品名称、描述、价格等的变量。它还可能包含一些函数来操作对象变量、存储或从数据库中检索产品的值、显示产品详细信息等。

在 PHP 中,对象是使用类定义的。类包含描述对象的函数和变量的所有定义。

这是一个简单产品类的示例:

 class Product
 {
   var $name;
   var $description;
   var $price;



function RetrieveFromDatabase($id)
   {
     /* ... */
   }

   function Display()
   {
     echo 'Name: ', HtmlSpecialChars($this->name),
       '<br>',
       'Description: ', HtmlSpecialChars($this->description),
       '<br>',
       'Price: ', $this->price; 
   }
 };

您可以使用new运算符创建对象。一个 PHP 脚本可以创建同一个类的多个对象。您可以在同一类定义的电子商务站点中出售两种不同的产品。

例如,如果您要出售 A 本书和 B 本书,您可以使用同一个类来操作其名称、描述、价格等。下面是一个如何创建 PHP 对象的示例:

$book_a = new Product();
 $book_a->name = 'Book A';
 $book_a->description = 'Some description of book A';
 $book_a->price = 9.95;
 $book_a->Display();

 $book_b = new Product();
 $book_b->RetrieveFromDatabase('id-of-book-b');
 $book_b->Display();

类允许您在内部操作信息,而不必使用全局变量在不同的类函数之间共享信息。

例如,如果你想检索和显示数据库查询结果,你可以有一个类,其中一个函数执行查询,另一个函数显示它。他们使用类变量 $results 来存储和检索查询结果句柄。

 class Query
 {
   var $results;

   function Execute($query)
   {
     $this->results = mysql_query($query);
     return $this->results !== false;
   }

   function Display()
   {
     while(($row = mysql_fetch_row($this->results)))
       print_r($row);
   }
 };

 $query = new Query;
 if($query->Execute(
   'SELECT name, description, price FROM product'
 ))
   $query->Display();

如您所见,您不需要使用任何全局函数或任何全局变量来在类函数之间共享信息。产品的所有行为都封装在 Query 类中。

面向对象编程提供了其他重要功能,例如继承,它允许创建作为现有类扩展的新类。扩展类可能有更多的函数和变量。他们还可以重新定义已经在基类中定义的函数和变量。

面向对象编程与类的资源链接

于 2013-04-02T06:33:19.247 回答
6

这就是我通常这样做的方式,例如functions.php(非常简化):

Myclass::init();

class MyClass
{
  // Add filters and actions here
  function init()
  {
    add_filter('pre_get_posts', array(__CLASS__, 'query_posts'));
  }

  function query_posts($query)
  {
    global $post; // you can use WP variables and functions
    // do something with $query
  }

  function navigation()
  {
    ?>
    <ul>
      <li><a href="<?= home_url() ?>">Home</a></li>
    </ul>
    <?php
  }
}

使用这种模式,您可以在静态类中组织所有函数(不需要实例化),然后您可以在任何模板中调用函数,如下所示:

<?php MyClass::navigation() ?>

希望这可以帮助。

于 2013-04-02T06:28:56.693 回答
1

是的,您可以在 Wordpress 主题中使用类。只需记住在调用其方法之前从该类实例化一个对象。

例如,假设我们要封装function1在一个名为 的类中Class1

class Class1 {
    function function1() {
        print("Called function1");
    }
}

现在为了调用我们需要从该类实例化一个对象的函数:

$object1 = new Class1;

鉴于所有这些都已完成,您现在可以调用类中定义的任何函数:

$object1->function1()

有关更多信息和详细信息,请查看PHP 的 Classes and Objects 文档

于 2013-04-02T06:23:17.423 回答