Получение названия дочернего класса в родительском классе (статический контекст)

Примите во внимание, что некоторые средства управления.NET будут автоматически HTML кодировать вывод. Например, установка.Text свойства на управлении TextBox автоматически закодирует его. Это конкретно означает преобразовывать < в &lt;, > в &gt; и & в &amp;. Так опасайтесь делать это...

myTextBox.Text = Server.HtmlEncode(myStringFromDatabase); // Pseudo code

Однако.Text свойство для HyperLink, Литерала и Маркировки не будет HTML кодировать вещи, таким образом обертывая Сервер. HtmlEncode (); вокруг чего-либо устанавливаемого на этих свойствах необходимость, если Вы хотите предотвратить <script> window.location = "http://www.google.com"; </script> от того, чтобы быть произведенным в свою страницу и впоследствии выполняемый.

Делают немного экспериментирования для наблюдения то, что кодируется и что не делает.

88
задан saalaa 12 November 2008 в 06:26
поделиться

2 ответа

Вам не нужно ждать выхода PHP 5.3, если вы можете придумать способ сделать это вне статического контекста. В php 5.2.9 в нестатическом методе родительского класса вы можете сделать:

get_class($this);

, и он вернет имя дочернего класса в виде строки.

т.е.

class Parent() {
    function __construct() {
        echo 'Parent class: ' . get_class() . "\n" . 'Child class: ' . get_class($this);
    }
}

class Child() {
    function __construct() {
        parent::construct();
    }
}

$x = new Child();

это выведет:

Parent class: Parent
Child class: Child

милая, да?

180
ответ дан 24 November 2019 в 07:23
поделиться

Если вы не хотите использовать get_called_class (), вы можете использовать другие приемы позднего статического связывания (PHP 5.3+). Но обратная сторона: в этом случае вам нужно иметь метод getClass () в каждой модели. ИМО, это не имеет большого значения.

<?php

class Base 
{
    public static function find($id)
    {
        $table = static::$_table;
        $class = static::getClass();
        // $data = find_row_data_somehow($table, $id);
        $data = array('table' => $table, 'id' => $id);
        return new $class($data);
    }

    public function __construct($data)
    {
        echo get_class($this) . ': ' . print_r($data, true) . PHP_EOL;
    }
}

class User extends Base
{
    protected static $_table = 'users';

    public static function getClass()
    {
        return __CLASS__;
    }
}

class Image extends Base
{
    protected static $_table = 'images';

    public static function getClass()
    {
        return __CLASS__;
    }
}

$user = User::find(1); // User: Array ([table] => users [id] => 1)  
$image = Image::find(5); // Image: Array ([table] => images [id] => 5)
6
ответ дан 24 November 2019 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: