Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

protectedへのアクセスが出来る?

More than 5 years have passed since last update.

Smartyの勉強を始めたところ、よく分からないことで躓いた。

BaseSmartyは共通設定と関数のオーバーライド、そしてdata変数の定義。
FormではBaseSmartyの継承とフォーム用のデータのセット、そしてメソッド呼び出し。

BaseSmarty.php
require_once('Smarty-3.1.19/libs/Smarty.class.php');

class BaseSmarty extends Smarty
{
    protected $data;

    public function __construct()
    {
        parent::__construct();

        $this->template_dir = 'templates/';
        $this->compile_dir  = 'templates_c/';
        $this->config_dir   = 'configs/';
        $this->cache_dir    = 'cache/';
    }

    protected function display($template = null, $cache_id = null, $compile_id = null, $parent = null)
    {
        foreach ($this->data as $k => $v) {
            $this->assign($k, $v);
        }
        return parent::display($template);
    }
}
Form.php
require_once('BaseSmarty.php');

class Form extends BaseSmarty
{
    public function __construct()
    {
        parent::__construct();
    }

    protected function showForm()
    {
        $this->data['content_tpl'] = 'form.tpl';
        $this->data['params'] = array(
            'request'  => 'ご意見',
            'question' => '質問',
            'other'    => 'その他',
        );

        $this->display('template.tpl');
    }
}

$smart = new Form();
$smart->showForm();

まずこの時点でForm.phpにアクセスしたところページが表示されるはずが真っ白。

そしてこれは知人の「displayがprotectedになってるから以下の2行から呼び出せていない」

Form.php
$smart = new Form();
$smart->showForm();

という助言で解決。ここってクラス外って扱いなんですね。そりゃそうか。

Form.php
protected function display(

public function display(

ということで上記のようにpublicに修正。
Form.phpにアクセスすると確かに表示されている。成功か!

しかしここで疑問。
showForm()もprotectedでありクラス外、なはずが何故か呼び出せている…?

試しに

Form.php
$a = 1;
中略
$smart->a;

としても呼び出せない。publicならもちろん呼び出せる。

なんでだろう…?

cakePHPではこういった話もあるようだけど、うーん…分からない!

piotzkhider
4月から勉強しはじめた初心者
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away