开发者

Call to a member function on a non-object (first try of writing OOP) [duplicate]

This question already has answers here: Call to a member function on a non-object [duplicate] (8 answers) Closed 10 years ago.

The class below is my first attempt at writing my own OOP application. I've used procedural for a while and the OO techniques are not coming as easily as I'd hoped.

The class is designed to put together input elements for HTML forms, optionally using SQL table records. I'm starting with the select box and will add more when I get this much working.

So the problem is that I'm getting

"Call to a member function get_table() on a non-object" on the 'public function get_table()' line of the Class code below.

I'm not sure why this is happening. Help/tips would be GREATLY appreciated.

and now the code:

Application:

        $_input = new html_form_input();
        $_input->set_input_type('select');
        $_input->set_table('stores');
        $_input->set_fieldname_id('store_id');
        $_input->set_fieldname_desc('store_name');
        $_input->set_sql_order(' ORDER BY store_name ASC ');
        $_input->set_select();

        $html_select_facility =  $_input->get_select();

Class:

class html_form_input 
{

    public $input_type;
    public $table;
    public $fieldname_id;
    public $fieldname_desc;
    public $passed_id;
    public $sql_where;
    public $sql_order;
    public $array_input_options;


    public function __construct()
    {
        // constructor method
    }

    /*
        setters
    */
    public function set_input_type($input_type)
    {
        $this->input_type = $input_type;
    }
    public function set_array_input_options($array_input_options)
    {
        $this->array_input_options = $array_input_options;
    }
    public function set_table($table)
    {
        $this->table = $table;
    }
    public function set_fieldname_id($fieldname_id)
    {
        $this->fieldname_id = $fieldname_id;
    }
    public function set_fieldname_desc($fieldname_desc)
    {
        $this->fieldname_desc = $fieldname_desc;
    }
    public function set_passed_id($passed_id)
    {
        $this->passed_id = $passed_id;
    }
    public function set_sql_where($sql_where)
    {
        $this->sql_where = $sql_where;
    }
    public function set_sql_order($sql_order)
    {
        $this->sql_order = $sql_order;
    }


    /*
        getters
    */
    public function get_input_type()
    {
        return $this->$input_type;
    }
    public function get_array_input_options()
    {
        return $this->$array_input_options;
    }
    public function get_table()
    {
        return $this->$table;
    }
    public function get_fieldname_id()
    {
        return $this->$fieldname_id;
    }
    public function get_fieldname_desc()
    {
        return $this->$fieldname_desc;
    }
    public function get_passed_id()
    {
        return $this->$passed_id;
    }
    public function get_sql_where()
    {
        return $this->$sql_where;
    }
    public function get_sql_order()
    {
        return $this->$sql_order;
    }




    /*
        set_query_form_data() queries the database for records to be used in the input element. 
    */
    public function set_query_form_data()
    {

        global $dbx;

        $debug = true;
        $_debug_desc        = "<span style='color:blue;'>function</span> <b>set_query_form_data</b>()";
        if ($debug)         { echo "<p>BEGIN $_debug_desc <blockquote>"; }

        $table->get_table();
        $fieldname_id->get_fieldname_id();
        $fieldname_desc->get_fieldname_desc();
        $passed_id->get_passed_id();
        $sql_where->get_sql_where();
        $sql_order->get_sql_order();

        if ($passed_id)
        {
            if (!is_array($passed_id))
            {
                $passed_id[] = $passed_id;
            }
        }

        if ($sql_where!='')
        {
            $sql_where = " WHERE $sql_where ";
        }


        $q = "
            SELECT
                $fieldname_id,
                $fieldname_desc 
            FROM 
                $table 
            $sql_where
            $sql_order
        ";
        $res = $mdb2_dbx->query($q);
        if (PEAR::isError($res)) {  gor_error_handler($res, $q, __LINE__,__FILE__,'die'); }
        while ( $r = $res->fetchRow(MDB2_FETCHMODE_ASSOC) )
        {
            $id     = $r[$fieldname_id];
            $desc   = $r[$fieldname_desc];
            $array_values[$id] = $desc;
        }

        $this->sql_array_values = $array_values;

        i开发者_运维知识库f ($debug) { echo "<p></blockquote>END $_debug_desc ";  }
    }

    /*
        getter for set_query_form_data (above)
    */
    public function get_query_form_data()
    {
        return $this->$array_values;
    }


    /*
        set_select() pieces together a select input element using database derived records, or a passed array of values. 
    */
    public function set_select($flag_query_db=1, $array_static_values=null)
    {

        if ($flag_query_db==1)
        {

            $array_values = $this->set_query_form_data();

        } else if (is_array($array_static_values)) {

            $array_values = $array_static_values;

        }


        $array_values   = $array_data['row_data'];
        $fieldname_id   = $array_data['fieldname_id'];
        $fieldname_desc = $array_data['fieldname_desc'];
        $passed_id      = $array_data['passed_id'];

        if (!is_array($passed_id))
        {
            $passed_id[] = $passed_id;
        }


        foreach ($array_values as $id=>$desc)
        {

            // handle passed values (multiple or single)
            $sel = null;
            if (in_array($id,$passed_id))
            {
                $sel = ' selected ';
            }

            // construct html
            $html_options .= " <option value='$id' $sel>$desc</option>\n";

        }

        $disabled   = null;
        $multiple   = null;
        $size       = null;
        $style      = null;
        $class      = null;
        $element_id = null;
        $javascript = null;

        if (is_array($array_input_options))
        {
            $s_disabled     = $array_input_options['disabled'];
            $s_multiple     = $array_input_options['multiple'];
            $s_size         = $array_input_options['size'];
            $s_style        = $array_input_options['style'];
            $s_id           = $array_input_options['id'];
            $s_class        = $array_input_options['class'];
            $s_javascript   = $array_input_options['javascript'];

            if ($s_disabled!='')    {$disabled      = ' disabled '; }
            if ($s_multiple!='')    {$multiple      = ' multiple '; }
            if ($s_size!='')        {$size          = ' size="'     . $s_size . '"'; }
            if ($s_style!='')       {$style         = ' style = "'  . $s_style . '"'; }
            if ($s_id!='')          {$element_id    = ' id = "'     . $s_id . '"'; }
            if ($s_class!='')       {$class         = ' class = "'  . $s_class . '"'; }
            if ($s_javascript!='')  {$javascript    = $s_javascript; }
        }

        $html = "
            <select name='$fieldname_id' $element_id $disabled $multiple $size $style $class $javascript>
                $html_options
            </select>
        ";

        $this->select_html = $html;

    }


    /*
        getter for set_select (above)
    */
    public function get_select()
    {
        return $this->$select_html;
    }


}


With your getters, instead of using $this->$var it should be $this->var, for example $this->table and not $this->$table.


In the following code, $table hasn't been initialised.

public function set_query_form_data()
{

    global $dbx;

    $debug = true;
    $_debug_desc        = "<span style='color:blue;'>function</span> <b>set_query_form_data</b>()";
    if ($debug)         { echo "<p>BEGIN $_debug_desc <blockquote>"; }

    $table->get_table();

You probably intend it to be $this, i.e. "the object currently being used":

public function set_query_form_data()
{

    global $dbx;

    $debug = true;
    $_debug_desc        = "<span style='color:blue;'>function</span> <b>set_query_form_data</b>()";
    if ($debug)         { echo "<p>BEGIN $_debug_desc <blockquote>"; }

    $this->get_table();


The problem is in your set_query_form_data method:

public function set_query_form_data() {
  // $table is no object
  $table->get_table();

  // you should use this instead
  $this->table
}

Note:

// Are you sure with this calls? Shouldn't it be $this->array_input_options ?
return $this->$array_input_options;


You're making use of variable functions/dereferencing, unintentionally. Example:

$foo = 'name';
echo $object->$foo; // same as echo $object->name

Object properties and methods do not need to be prefixed with $.


With the pointers from the other answers and some more RTM, I got the basic script working. In particular, I removed the "$" from property names and accessed the properties of $this instead of calling get_* methods.

Application:

        $array_input_options = array(
            'include_blank_option' => 1,
            'disabled'  => 0,
            'multiple' => 0,
            'size' => '',
            'style' => '',
            'id' => '',
            'class' => '',
            'javascript' => '',
        );

        $_input = new html_form_input();
        $_input->set_input_type('select');
        $_input->set_table('gor_facility');
        $_input->set_fieldname_id('facilityid');
        $_input->set_fieldname_desc('facilityname');
        $_input->set_sql_where(' status = 1');
        $_input->set_sql_order(' ORDER BY facilityname ASC ');
        $_input->set_array_input_options($array_input_options);
        // $_input->set_passed_id('');

        $html_select_facility =  $_input->create_select();

Class:

class html_form_input 
{

    public $input_type;
    public $table;
    public $fieldname_id;
    public $fieldname_desc;
    public $passed_id;
    public $sql_where;
    public $sql_order;
    public $array_input_options;


    public function __construct()
    {
        // constructor method
    }

    /*
        setters
    */
    public function set_input_type($input_type)
    {
        $this->input_type = $input_type;
    }
    public function set_array_input_options($array_input_options)
    {
        $this->array_input_options = $array_input_options;
    }
    public function set_table($table)
    {
        $this->table = $table;
    }
    public function set_fieldname_id($fieldname_id)
    {
        $this->fieldname_id = $fieldname_id;
    }
    public function set_fieldname_desc($fieldname_desc)
    {
        $this->fieldname_desc = $fieldname_desc;
    }
    public function set_passed_id($passed_id)
    {
        $this->passed_id = $passed_id;
    }
    public function set_sql_where($sql_where)
    {
        $this->sql_where = $sql_where;
    }
    public function set_sql_order($sql_order)
    {
        $this->sql_order = $sql_order;
    }


    /*
        getters
    */
    public function get_input_type()
    {
        return $this->input_type;
    }
    public function get_array_input_options()
    {
        return $this->array_input_options;
    }
    public function get_table()
    {
        return $this->table;
    }
    public function get_fieldname_id()
    {
        return $this->fieldname_id;
    }
    public function get_fieldname_desc()
    {
        return $this->fieldname_desc;
    }
    public function get_passed_id()
    {
        return $this->passed_id;
    }
    public function get_sql_where()
    {
        return $this->sql_where;
    }
    public function get_sql_order()
    {
        return $this->sql_order;
    }




    /*
        set_query_form_data() queries the database for records to be used in the input element. 
    */
    public function set_query_form_data()
    {

        global $mdb2_dbx;

        $debug = false;
        $_debug_desc        = "<span style='color:blue;'>function</span> <b>set_query_form_data</b>()";
        if ($debug)         { echo "<p>BEGIN $_debug_desc <blockquote>"; }

        $table          = $this->table;
        $fieldname_id   = $this->fieldname_id;
        $fieldname_desc = $this->fieldname_desc;
        $passed_id      = $this->passed_id;
        $sql_where      = $this->sql_where;
        $sql_order      = $this->sql_order;

        if ($passed_id)
        {
            if (!is_array($passed_id))
            {
                $passed_id[] = $passed_id;
            }
        }

        if ($sql_where!='')
        {
            $sql_where = " WHERE $sql_where ";
        }


        $q = "
            SELECT
                $fieldname_id,
                $fieldname_desc 
            FROM 
                $table 
            $sql_where
            $sql_order
        ";
        if ($debug) {echo "<p>$q<br>";}
        $res = $mdb2_dbx->query($q);
        if (PEAR::isError($res)) {  gor_error_handler($res, $q, __LINE__,__FILE__,'die'); }
        while ( $r = $res->fetchRow(MDB2_FETCHMODE_ASSOC) )
        {
            $id     = $r[$fieldname_id];
            $desc   = $r[$fieldname_desc];
            $array_values[$id] = $desc;
        }

        $this->sql_array_values = $array_values;

        if ($debug) { echo "<p></blockquote>END $_debug_desc ";  }
    }

    /*
        getter for set_query_form_data (above)
    */
    public function get_query_form_data()
    {
        return $this->sql_array_values;
    }


    /*
        set_select() pieces together a select input element using database derived records, or a passed array of values. 
    */
    public function construct_select($flag_query_db=1, $array_static_values=null)
    {

        if ($flag_query_db==1)
        {

            $this->set_query_form_data();
            $row_data = $this->sql_array_values;

        } else if (is_array($array_static_values)) {

            $row_data = $array_static_values;

        }


        $fieldname_id       = $this->fieldname_id;
        $fieldname_desc     = $this->fieldname_desc;
        $passed_id          = $this->passed_id;
        $array_input_options = $this->array_input_options;

        if (!is_array($passed_id))
        {
            $passed_id[] = $passed_id;
        }


        $disabled   = null;
        $multiple   = null;
        $size       = null;
        $style      = null;
        $class      = null;
        $element_id = null;
        $javascript = null;
        $html_option_blank = null;

        if (is_array($array_input_options))
        {
            $s_disabled     = $array_input_options['disabled'];
            $s_multiple     = $array_input_options['multiple'];
            $s_size         = $array_input_options['size'];
            $s_style        = $array_input_options['style'];
            $s_id           = $array_input_options['id'];
            $s_class        = $array_input_options['class'];
            $s_javascript   = $array_input_options['javascript'];
            $s_blank        = $array_input_options['include_blank_option'];

            if ($s_disabled!='')    {$disabled      = ' disabled '; }
            if ($s_multiple!='')    {$multiple      = ' multiple '; }
            if ($s_size!='')        {$size          = ' size="'     . $s_size . '"'; }
            if ($s_style!='')       {$style         = ' style = "'  . $s_style . '"'; }
            if ($s_id!='')          {$element_id    = ' id = "'     . $s_id . '"'; }
            if ($s_class!='')       {$class         = ' class = "'  . $s_class . '"'; }
            if ($s_javascript!='')  {$javascript    = $s_javascript; }
            if ($s_blank==1)        { $row_data = array(''=>'Select an option below:') + $row_data; }
        }



        if (is_array($row_data))
        {
            foreach ($row_data as $id=>$desc)
            {

                // handle passed values (multiple or single)
                $sel = null;
                if (in_array($id,$passed_id))
                {
                    $sel = ' selected ';
                }

                // construct html
                $html_options .= " <option value='$id' $sel>$desc</option>\n";

            }
        }


        $html = "
            <select name='$fieldname_id' $element_id $disabled $multiple $size $style $class $javascript>
                $html_option_blank
                $html_options
            </select>
        ";

        $this->select_html = $html;

    }


    /*
        getter for set_select (above)
    */
    public function create_select()
    {
        $this->construct_select();
        return $this->select_html;
    }


}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜