Я не могу получить правильные значения из свойств, установленных из следующего класса ООП

class person {

    private $defaults = [
        'post_types'        => [],
        'number'            => 1,
        'use_referrers'     => true,
        'in_same_term'      => false,
        'include'           => [],
        'exclude'           => [],
        'taxonomy'          => 'category',
        'include_children'  => true,
        'previous'          => true,
        'boundary_posts'    => false,
        'anchor_text'       => '%anchor',
        'post_link_text'    => '%text',
        'separator'         => '</br>',
        'span_separator'    => '</br>',
        'span_text_prev'    => 'Older post: ',
        'span_text_next'    => 'Newer post: ',
        'span_text_oldest'  => 'Oldest post: ',
        'span_text_newest'  => 'Newest post: ',

    ];

    public $post;
    public $is_referred_post    = false;
    public $is_author_referrer  = false;
    public $is_search_referrer  = false;
    public $is_tax_referrer     = false;


    public function post( $post ) {

        $this->post = get_queried_object();
        return $this->post;

    }

    public function referrers_defaults() {

        //Set is_author_referrer if query_var aq is set
        if( isset( $_GET['aq'] ) ) {

            $this->is_author_referrer = true;

        }

        //Set is_search_referrer if query_var sq is set
        if( isset( $_GET['sq'] ) ) {

            $this->is_search_referrer = true;

        }

        //Set is_tax_referrer if query_var tq is set
        if( isset( $_GET['tq'] ) ) {

            $this->is_tax_referrer = true;

        }

        //Set is_referred_post if the current single post has one of the query_vars in the URL
        if( $this->is_author_referrer || $this->is_search_referrer || $this->is_tax_referrer ) {

            $this->is_referred_post = true;

        }
        return $this;
    }

}
$a = new person();
?><pre><?php var_dump($a); ?></pre><?php    

Это то, что я получаю от var_dump( $a );

object(person)#569 (6) {
  ["defaults":"person":private]=>
  array(18) {
    ["post_types"]=>
    array(0) {
    }
    ["number"]=>
    int(1)
    ["use_referrers"]=>
    bool(true)
    ["in_same_term"]=>
    bool(false)
    ["include"]=>
    array(0) {
    }
    ["exclude"]=>
    array(0) {
    }
    ["taxonomy"]=>
    string(8) "category"
    ["include_children"]=>
    bool(true)
    ["previous"]=>
    bool(true)
    ["boundary_posts"]=>
    bool(false)
    ["anchor_text"]=>
    string(7) "%anchor"
    ["post_link_text"]=>
    string(5) "%text"
    ["separator"]=>
    string(5) "
"
    ["span_separator"]=>
    string(5) "
"
    ["span_text_prev"]=>
    string(12) "Older post: "
    ["span_text_next"]=>
    string(12) "Newer post: "
    ["span_text_oldest"]=>
    string(13) "Oldest post: "
    ["span_text_newest"]=>
    string(13) "Newest post: "
  }
  ["post"]=>
  NULL
  ["is_referred_post"]=>
  bool(false)
  ["is_author_referrer"]=>
  bool(false)
  ["is_search_referrer"]=>
  bool(false)
  ["is_tax_referrer"]=>
  bool(false)
}

Моя проблема в этом разделе

  ["post"]=>
  NULL
  ["is_referred_post"]=>
  bool(false)
  ["is_author_referrer"]=>
  bool(false)
  ["is_search_referrer"]=>
  bool(false)
  ["is_tax_referrer"]=>
  bool(false)

['post'] не должно быть NULL, он должен давать значения из текущего сообщения. Если я сделаю var_dump($a->post());, я получу объект сообщения.

Кроме того, предположим, что следующая переменная установлена ​​в URL-адресе ?aq=2, ["is_author_referrer"] и ["is_referred_post"] должны возвращать true, но они возвращают false, как вы можете видеть из var_dump().

Почему для этих свойств установлены неправильные значения. Что мне не хватает в ООП

0
Pieter Goosen 1 Фев 2015 в 21:01

2 ответа

Лучший ответ

$a->post() вызывает post метод , который не является свойством. Когда вы вызываете этот метод, он откуда-то получает значение (get_queried_object). Это значение возвращается, но также сохраняется в свойстве post. Я думаю, это причина, по которой вы считаете, что недвижимость должна быть заполнена. Но до тех пор, пока вы не вызовете метод, свойство останется нулевым.

Я не знаю лучшего решения, так как я не знаю остальной части вашего приложения (например, как построен этот объект сообщения, что такое get_queried_object и из какой точки он доступен, и т. Д.). Тем не менее, я надеюсь, что я определил для вас проблему, и это поможет вам найти правильное решение.

Одна из возможных идей - вместо этого установить $post из конструктора, но, как я уже сказал, будет ли это работать, зависит от других факторов:

public function __construct() {
    $this->post = get_queried_object();
}

Конструктор __construct вызывается, когда вы создаете новый объект.

2
GolezTrol 1 Фев 2015 в 18:17

У меня возникло недопонимание насчет конструктора, и благодаря @GolezTrol у меня все заработало правильно

Вот финальная рабочая версия на данном этапе

class person {

    private $defaults = [
        'post_types'        => [],
        'number'            => 1,
        'use_referrers'     => true,
        'in_same_term'      => false,
        'include'           => [],
        'exclude'           => [],
        'taxonomy'          => 'category',
        'include_children'  => true,
        'previous'          => true,
        'boundary_posts'    => false,
        'anchor_text'       => '%anchor',
        'post_link_text'    => '%text',
        'separator'         => '</br>',
        'span_separator'    => '</br>',
        'span_text_prev'    => 'Older post: ',
        'span_text_next'    => 'Newer post: ',
        'span_text_oldest'  => 'Oldest post: ',
        'span_text_newest'  => 'Newest post: ',

    ];

    public $current_post;
    public $is_referred_post    = false;
    public $is_author_referrer  = false;
    public $is_search_referrer  = false;
    public $is_tax_referrer     = false;

    public function __construct() {

        $this->init();

    }

    public function init() {

        $this->getCurrentpost();
        $this->referrers();

    }

    public function getCurrentpost() {

        return $this->current_post = get_queried_object();

    }

    public function referrers() {

        //Set is_author_referrer if query_var aq is set
        if( isset( $_GET['aq'] ) ) {

            $this->is_author_referrer = true;

        }

        //Set is_search_referrer if query_var sq is set
        if( isset( $_GET['sq'] ) ) {

            $this->is_search_referrer = true;

        }

        //Set is_tax_referrer if query_var tq is set
        if( isset( $_GET['tq'] ) ) {

            $this->is_tax_referrer = true;

        }

        //Set is_referred_post if the current single post has one of the query_vars in the URL
        if( $this->is_author_referrer || $this->is_search_referrer || $this->is_tax_referrer ) {

            $this->is_referred_post = true;

        }

    }

}
$a = new person();
0
Pieter Goosen 1 Фев 2015 в 19:09