0

たとえば、imagesデータベースにクエリを実行して画像ソース、画像名、およびその他の文字列を取得するクラスが呼び出されたとします。

$sql = Nemesis::select("profile_picture_thumb, profile_picture_large, facebook_id", "users", "id = '{$_SESSION[user_id]}'");
list($profile_picture_thumb, $profile_picture_large, $facebook_id) = $sql->fetch_row();

クラス内の多数の関数でアクセスできるように__constructこれらを設定する方法はありますか? $varさらに、簡潔さ以外にこれを行うことでパフォーマンス上の利点はありますか? 多数の関数の下ではなく、基本的にデータベースを一度クエリして、クラスのパフォーマンス内で「グローバル」として設定すると、パフォーマンスが向上すると思います...またはいいえ?

より明示的に:

class Images
{
    var $main_prepend = 'm_';
    var $thumb_prepend = 't_';
    var $default_ext = 'jpg';
    var $cropfactor;
    private $profile_picture_thumb;
    private $profile_picture_large;
    private $facebook_id;
    public function __construct()
    {
        $sql = Nemesis::select("profile_picture_thumb, profile_picture_large, facebook_id", "users", "id = '{$_SESSION[user_id]}'");
        list($profile_picture_thumb, $profile_picture_large, $facebook_id) = $sql->fetch_row();
        $this->profile_picture_thumb = $profile_picture_thumb;
        $this->profile_picture_large = $profile_picture_large;
        $this->facebook_id = $facebook_id;
    }
    public function profilePic($show = true, $delete = false)
    {
        if ($show) {
            echo '<script type="text/javascript">$(function() { $("#profile-picture").tipsy({fade: true}); });</script>';
            if (is_file(ROOT . $this->profile_picture_thumb)) {
                echo '<img src="' . reduce_double_slashes('../' . $this->profile_picture_thumb) . '" id="profile-picture" class="profile-picture" title="Your Profile Picture">';
            } elseif (!empty($this->facebook_id)) {
                // if there is no profile picture set, and user has listed fb profile picture, get profile picture
                $fb_p_thumb = "http://graph.facebook.com/{$facebook_id}/picture";
                $fb_p_large = "http://graph.facebook.com/{$facebook_id}/picture?type=large";
                echo '<img src="' . $fb_p_thumb . '" id="profile-picture" class="profile-picture" title="Facebook Profile Picture">';
            } else {
                echo '<img src="images/50x50_placeholder.gif" id="profile-picture" class="profile-picture" title="Click to add profile picture">';
            }
        }
        if ($delete) {
            if (is_file(ROOT . $this->profile_picture_thumb) || is_file(ROOT . $this->profile_picture_larg)) {
                if (!unlink(ROOT . $this->profile_picture_thumb) && !unlink(ROOT . $this->profile_picture_larg)) {
                    $msg->add('e', "Could not delete user profile picture!");
                }
            } else {
                $msg->add('e', "Files not found in directory.");
            }
        }
    }
    public function profilePicExists($msg = true, $delete = false)
    {
        if ($msg) {
            if (is_file(ROOT . $this->profile_picture_thumb)) {
                echo '<div class="ec-messages messages-success">Profile picture exists or was added! It may be required to refresh the page to view changes.</div>';
            }
        }
        if ($delete) {
            if (is_file(ROOT . $this->profile_picture_thumb)) {
                echo '<input name="doDelete" type="submit" class="btn btn-warning" id="doDelete2" value="Remove Profile Picture">';
            }
        }
    }

動作しません。

4

1 に答える 1

0
class Images {
    private $src;
    private $name;

    public function __construct($src, $name) {
        $this->src = $src;
        $this->name = $name;
    }

    public function get_src() {
        return $this->src;
    }

    public function get_name() {
        return $this->name;
    }
}

$instance = new Images('image.jpg', 'Cute Duck');
echo $instance->get_src();
echo '<br>';
echo $instance->get_name();

ここで、Images クラスでは、名前とソースを 2 つのクラス変数に格納します。これらは、新しい Image クラスを作成するときにコンストラクターで設定できます。get_name()2 つの getter 関数と で値を取得できますget_src()

これらの変数を public に設定して、直接アクセスすることもできます。

class Images {
    public $src;
    public $name;
}

$instance = new Images();
$instance->src = 'image.jpg';
$instance->name = 'Cute Duck';

echo $instance->src;
echo '<br>';
echo $instance->name;

次のようにクエリを保存して実行できます。

class Images {
    private $query;
    private $result;

    public function __construct($query) {
        $this->query = $query;
        //run query than store it in $this->result;
    }

    public function get_result() {
        return $this->result;
    }
}

$instance = new Images('SELECT * FROM stuff');
echo $instance->get_result();

このようにして、ジョブを実行して結果を格納するコンストラクターに SQL ステートメントを渡すことができます。ゲッターを介して、またはクラス内の他の関数で結果にアクセスできます。
これは永続的な解決策ではないことに注意してください。サーバー側でクラスを使用するページをリロード (または別のページに移動) すると、最初から開始されます。ただし、コードを構造化し、よく使用する共通関数をクラスに配置できるため、コードを複製する必要はありません。
たとえば、名前、サイズ、ファイル拡張子、ソースなどを格納できる Image クラスを作成できます。これらは、クラスを作成するときにコンストラクターで指定するか、セッターを介して、またはクラス変数が public の場合は直接設定できます。
これらを設定すると、クラスにあるすべての機能を使用できます。たとえば、画像をコピーする関数、サイズ変更または名前を変更する関数、削除する関数を作成できます。具体的なイメージを操作する必要があるときはいつでも、クラス インスタンスを作成し、必要な関数を呼び出すだけです。
元の画像を削除したり、画像のサイズを変更してからクローンしたりする以外に、画像のクローンなど、より多くの操作を実行する場合は、画像のすべての設定を再度設定する必要はありません。関数はそれにアクセスできます。

于 2013-08-04T22:44:38.270 に答える