我可以在wordpress主题功能中创建自己的PHP类吗?

时间:2013-04-02 06:21:09

标签: php wordpress

我为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-&GT; JS( '自举-transition.js,自举-modal.js,自举-dropdown.js');

但是当我打电话给它时,另一个函数是这样的:

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

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

3 个答案:

答案 0 :(得分: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类中。

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

Object Oriented Programming with Classes

的资源链接

答案 1 :(得分: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() ?>

希望这有帮助。

答案 2 :(得分:1)

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

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

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

现在为了调用我们需要的函数instantiate an object from that class

$object1 = new Class1;

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

$object1->function1()

有关详情和详情,请查看PHP's documentation on Classes and Objects