PHP: كيفية تنفيذ طريقة تشبه __get لمتغيرات الوظائف المحلية

StackOverflow https://stackoverflow.com/questions/2669195

  •  28-09-2019
  •  | 
  •  

سؤال

أنا لست غريبًا على __get () ، وقد استخدمته لصنع بعض المكتبات المريحة للغاية في الماضي. ومع ذلك ، أواجه تحديًا جديدًا (PHP 5.3 ، اختصر وتبسيط الكود الخاص بي لهذا السؤال):

<?php
namespace test;

class View {
    function __construct($filename, $varArray) {
        $this->filename = $filename;
        $this->varArray = $varArray;
    }

    function display() {
        include($this->filename);
    }

    function __get($varName) {
        if (isset($this->varArray[$varName]))
            return $this->varArray[$varName];
        return "?? $varname ??";
    }
}

?>

أعلاه هو نظام مبسط للغاية لتحميل طريقة العرض. سيتصل هذا الرمز بالعرض ويعرضه:

<?php

require_once("View.php");

use test\View;

$view = new View("views/myview.php", array("user" => "Tom"));
$view->display();

?>

هدفي لهذا الرمز هو السماح لعرض "myview.php" أن يحتوي على رمز مثل هذا:

<p>
    Hello <?php echo $user; ?>!  Your E-mail is <?php echo $email; ?>
</p>

ويستخدم مع الكود أعلاه ، هذا من شأنه أن يخرج "مرحبا توم! البريد الإلكتروني الخاص بك هو البريد الإلكتروني ؟؟"

ومع ذلك ، هذا لن ينجح. يتم تضمين العرض في طريقة الفصل ، لذلك عندما يشير إلى مستخدم $ والبريد الإلكتروني $ ، فإنه يبحث عن متغيرات الوظائف المحلية - وليس المتغيرات التي تنتمي إلى فئة العرض. لهذا السبب ، لا يتم تشغيل __get.

يمكنني تغيير جميع متغيرات عرضي إلى أشياء مثل $ this-> $ this-> elem ، لكن هذا سيكون حلاً فوضويًا وغير بديهي. أحب أن أجد طريقة يمكنني من خلالها الرجوع إلى المتغيرات مباشرةً دون أن يرمي PHP خطأ عند استخدام متغير غير محدد.

أفكار؟ هل هناك طريقة نظيفة للقيام بذلك ، أم أنني مجبر على اللجوء إلى حلول الاختراق؟

هل كانت مفيدة؟

المحلول

تحرير إجابتي. abit من "الاختراق حول" ولكن حل محتمل. قد ترغب في "إعادة تعيين" error_handler إلى وظائف أكثر عاما.

عرض

<?php
error_reporting(E_ALL);
ini_set("display_errors", 0);
class View {
    function display($file, $values) {        
        set_error_handler(array($this, '__get'), E_NOTICE);        
        extract($values);
        include($file);
    }

    function __get($vaule)
    {
        echo '<i>Unknown</i>';
    }
}

$View = new View;
$values = array('user' => 'Tom',
               'email' => 'email@host.com');

$View->display('/filename.php', $values);
?>

filename.php

Hello <?php echo $user; ?>, your email is <?php echo $email; ?> and your are <?php echo $age; ?> years old.

انتاج |

Hello Tom, your email is email@host.com and your are مجهول years old.

نصائح أخرى

يمكنك استخدام مقتطف لسحب جميع المتغيرات إلى النطاق المحلي:

function display() {
    extract($this->varArray);
    include($this->filename);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top