💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ اسماعیل آبابائی
محل کال کردن parent::__construct در متد __construct کلاس فرزند
جامعه وردپرس (برنامه نویسی) ایجاد شده در ۲۵ آذر ۱۴۰۲

با سلام و خسته نباشید.

استاد در دوره تاکید داشتند که حتما بعد از مقدار دهی پراپرتی‌ها در متد construct‌ کلاس فرزند، متد Construct والد کال شود(حتما در انتها). 

اما مشکلی که پیش میاد این است پراپرتی‌هایی که مقدار دیفالت براشون توی کلاس والد تعریف کردیم override نمیشن چون==> ما اول پراپرتی را توی متد سازنده فرزند، مقدار دهی میکنیم و بعد مقدار دیفالتی که توی والد مقداردهی کردیم را کال میکنیم که در نهایت مقدار دیفالت ست میشه.(کدهای زیر)

 

حالا سوالم از استاد این هستش: 

۱. آیا به مشکل برمیخوریم اگر ابتدای متد construct فرزند، متد construct والد را کال کنیم ؟ (در این صورت مشکل override شدن حل می‌شود.)

۲. در صورتی که به مشکل میخوریم، چه راه‌کاری برای موضوع override نشدن مقداری که تعیین میکنیم با مقدار دیفالت وجود دارد؟

 

- متد construct در کلاس والد (کلاس بیس)

 

  public function __construct()
    {
        // Properties that have not been initialized:  $labels, $rewrite, $description, $post_type_key
        // Properties that have been initialized already
        $this->public = true;
        $this->publicly_queryable = true;
        $this->show_ui = true;
        $this->show_in_menu = true;
        $this->query_var = true;
        $this->capability_type = 'post';
        $this->has_archive = true;
        $this->hierarchical = true;
        $this->menu_position = null;
        $this->supports = ['title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments'];
        $this->show_in_rest = false;
        $this->taxonomies = ['category', 'post_tag'];
        // Hook into the 'init' action to register the custom post type
        add_action('init', [$this, 'register_custom_post_type']);
    }

    

- متد construct در کلاس فرزند: 

من اینجا پراپرتی $this->taxonomies‌ مقدار دهی کردم ولی override‌ نشد و کاماکان مقدار دیفالتش که دوتا تاگزونومی داشت را خوند.

 

 public function __construct()
    {
        // Set specific values for the book custom post type
        $this->post_type_key = 'book';
        $this->description = 'Book custom post type.';
        $this->rewrite = ['slug' => 'book'];
        $this->taxonomies = ['post_tag'];
        // Set labels for the book custom post type
        $this->labels =[...];
        // Call the parent class constructor
        parent::__construct();
        }

 

- وقتی construct‌ رو بالای پراپرتی‌ها کال کردم مشکل برطرف و اجرا شد.

 

 public function __construct()
    {
    	// Call the parent class constructor
        parent::__construct();
        // Set specific values for the book custom post type
        $this->post_type_key = 'book';
        $this->description = 'Book custom post type.';
        $this->rewrite = ['slug' => 'book'];
        $this->taxonomies = ['post_tag'];
        // Set labels for the book custom post type
        $this->labels =[...];
        }

 

سلام،


1.

اگر ابتدای متد construct فرزند، متد construct والد را کال کنید، مشکلی پیش نمی‌آید. در این صورت، مقدار پراپرتی‌های کلاس والد قبل از مقداردهی مجدد در کلاس فرزند، تعیین می‌شوند. یعنی درواقع کدها بصورت خط به خط اجرا میشوند بنابراین هر کدی زودتر بیاید پس ابتدا اجرا میشود و مقادیر هم assign میشوند.

 

2.

راه حل دیگری که برای موضوع override نشدن مقداری که تعیین می‌کنیم با مقدار دیفالت وجود دارد، استفاده از کلمه کلیدی isset() است. در این صورت، اگر مقدار پراپرتی در کلاس فرزند تعریف شده باشد، از آن استفاده می‌شود و در غیر این صورت، از مقدار دیفالت کلاس والد استفاده می‌شود.

if (!isset($this->taxonomies)) {
    $this->taxonomies = ['post_tag'];
}

 

یا اینکه راه حل دیگر اگر بخواهیم متد construct والد را در انتها صدا بزنیم، راه حل این است که مقادیر پیش‌فرض در کلاس والد را در یک متد جداگانه تنظیم کنیم، مثلاً به اسم setDefaults. سپس در متد construct فرزند، ابتدا مقادیر خودمان را تنظیم کرده و بعد از صدا زدن متد construct والد، متد setDefaults را صدا بزنیم تا مقادیر پیش‌فرض والد هم تنظیم شوند.

محسن موحد ۲۷ آذر ۱۴۰۲، ۱۲:۵۳