预期已传递变量内容时未定义的变量的错误

时间:2021-12-19 作者:Luigino

我实现了一个简单的类,如:

class my_form {

        private $error_message;

        function __construct()
        {
            add_shortcode(\'my_form_custom\', array($this, \'show_custom_form\'));
        }

        function registration_template_form() {
        ?>              
            <div class="popup_canvas_container">            
                <form id="my_form" class="my_form" method="post" action="<?php echo esc_url($_SERVER[\'REQUEST_URI\']); ?>">
                    <p><label for="first_field">Field1:</label>&nbsp;<input type="text" name="first_field" id="first_field" value="<?php echo(isset($_POST[\'first_field\']) ? $_POST[\'first_field\'] : null); ?>" required /></p>
                    [...]
                    <div class="confirmation_box">
                        <p><button name="post_form" id="post_form" type="submit"><?php _e(\'Submit\', \'my_form_textdomain\'); ?></button></p>                      
                    </div>
                </form>
                <div id="messages_box" class="messages_box">
                    <p><div id="message_label"></div></p>
                </div>              
            </div>          
            
        <?  
        }                   
                    
        function form_validation() {
            if ( strlen($this->first_field) < 4 ) { 
                $error_message = \'Too short!\';
                return false;
            }
        }
                    
        function save_to_db() {         
            if ( !$this->form_validation() ) {
                ?>                   
                    <script language="javascript">$("#message_label").text("<?php echo $error_message; ?>"); $(\'#messages_box\').dialog();</script>
                <?php
            } else {    
            }
        }
                    
        function show_custom_form() {
            ob_start():
            
            if (isset($_POST[\'post_form\'])) {
                $this->save_to_db();
            }
            
            $this->show_template_form();
            
            return ob_get_clean();
        }
}
而且,就像我在Google上几乎到处都能找到的一样,用jquery将内容的变量传递给消息框div,我只是做了一个回显,然后我应该显示错误消息,显示一个对话框消息。但我一直在控制台日志中记录此错误:

<script language="javascript">$("#message_label").text("<br />
<b>Notice</b>:  Undefined variable: error_message in <b>..../my_form.php</b> on line <b>108</b><br />
"); $(\'#messages_box\').dialog();</script>
此时,将变量的内容传递给div的正确方法是什么?提前感谢!干杯,路易吉

编辑:如果我使用传递函数值实现,如下所示:

class my_form {

        private $first_field;
        public $error_message;      

        function __construct()
        {
            add_shortcode(\'my_form_custom\', array($this, \'show_custom_form\'));
        }

        function registration_template_form() {
        ?>              
            <div class="popup_canvas_container">            
                <form id="my_form" class="my_form" method="post" action="<?php echo esc_url($_SERVER[\'REQUEST_URI\']); ?>">
                    <p><label for="first_field">Field1:</label>&nbsp;<input type="text" name="first_field" id="first_field" value="<?php echo(isset($_POST[\'first_field\']) ? $_POST[\'first_field\'] : null); ?>" required /></p>
                    [...]
                    <div class="confirmation_box">
                        <p><button name="post_form" id="post_form" type="submit"><?php _e(\'Submit\', \'my_form_textdomain\'); ?></button></p>                      
                    </div>
                </form>
                <div id="messages_box" class="messages_box">
                    <p><div id="message_label"></div></p>
                </div>              
            </div>          
            
        <?  
        }                   
                    
        function form_validation() {
            if ( strlen($this->first_field) < 4 ) { 
                //$error_message = \'Too short!\';
                //return false;
                
                return WP_Error(\'first_field_length\', \'Too short. At least 4 characters is required.\' );
            }
        }
                    
        function save_to_db() {         
            if ( !$this->form_validation() ) {
                ?>                   
                    <script language="javascript">$("#message_label").text("<?php echo $this->form_validation()->get_error_message(); ?>"); $(\'#messages_box\').dialog();</script>
                <?php
            } else {    
            }
        }
                    
        function show_custom_form() {
            ob_start():
            
            if (isset($_POST[\'post_form\'])) {
                $this->save_to_db();
            }
            
            $this->show_template_form();
            
            return ob_get_clean();
        }
}
然后它会传递消息,但要看到对话框出现,它会在entry\\u content的layout div之后的版面上显示消息,此时它应该传递到dialog的div template消息框中。。。。这就是为什么我尝试传递一个变量。。。

1 个回复
SO网友:Tom J Nowell

问题是代码忽略了范围,这是一个基本的编程概念。

此范围:

        function form_validation() {
...
                $error_message = \'Too short!\';
...
        }
此范围:

        function save_to_db() {         
...           
                    ... echo $error_message;...
        }
都不一样。期望它移交是不合理和不合逻辑的。分配时$error_message a值form_validation 变量仅存在于内部的函数form_validation(). 一旦该函数完成执行,就不再引用该变量,可以对其进行垃圾收集。

什么时候save_to_db 碰巧它在不同的范围内,所以即使error_message 从…起form_validation 仍然存在,它将不一样$error_message 变量

这就是为什么我们有global 关键字,但重要的是,对象可以保存状态,即类成员变量。这是类首先存在的主要原因之一,并且由于某些原因它没有被使用。类本身不是;“更好”,它们是一种工具,如果您只需要一个可以在任何地方访问的全局变量,那么您应该使用函数,或者返回值。

讽刺的是,您已经使用了该解决方案,并且使用的方式会产生完全相同的警告:

if ( strlen($this->first_field) < 4 ) { 
代码中没有给出first_field 一个值,或以任何方式定义它。在使用它之前,您必须通过定义它或给它一个值来声明它存在。你不能凭空捏造。

进一步阅读:

https://www.php.net/manual/en/language.oop5.properties.php

相关推荐