Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"Meta-objects"?

Tags:

oop

php

I want to do something like this:

class StrangeClass {

    public function somethingLikeAMethod($var) {
        /* ... */
    }

    public function awesomeTest() {
        /* ... */
    }

}

$obj = new StrangeClass;
$ex1 = $obj->somethingLikeAMethod(1);

$ex2 = $obj->somethingLikeAMethod(2);

$ex1 -> awesomeTest(); // This will output "1"
$ex2 -> awesomeTest(); // This will output "2"

Other words, I want that object change its behavior.

In Lua language I can make this with 'metatables', but I doesn't know how to make this in OO-PHP. Thank you.

Added:

I did something like this in Lua:

local query = Database.query(...) -- now this variable has a query id
local query2 = Database.query(...) -- this is a other query id

local result = query.fetchAssoc() -- read below
local result2 = query.fetchAssoc() -- I called the same object with same method twice, but it will return other results

Added #2:

What I want to do:

$db = new Database();

$firstResult = $db->query('SELECT * FROM `table`')->fetch_assoc();
$firstExample = $db->query("SELECT * FROM `table` WHERE `id` = '1'");
$secondExample = $db->query("SELECT * FROM `table` WHERE `id` = '2'");

$secondResult = $firstExample -> fetch_assoc();
$thirdResult = $secondExample -> fetch_assoc();
like image 442
user0103 Avatar asked Aug 23 '26 18:08

user0103


1 Answers

God knows why you want it, but this will work for you:

class StrangeClass {

    public function somethingLikeAMethod($var) {
        $this->test_var = $var;
        return clone $this;
    }

    public function awesomeTest() {
        echo $this->test_var;
    }

}

$obj = new StrangeClass;
$ex1 = $obj->somethingLikeAMethod(1);

$ex2 = $obj->somethingLikeAMethod(2);

$ex1->awesomeTest(); // This will output "1"
$ex2->awesomeTest(); // This will output "2"

Edit: If you're looking for a queuing system, you can push each query into an array, something like:

class StrangeClass {

    private $queries = array();

    public function somethingLikeAMethod($var) {
        $this->queries[] = $var;
        return $this;
    }

    public function awesomeTest() {
        if(count($this->queries) === 0){
            echo 'no queries left';
        }
        echo $this->queries[0];
        array_splice($this->queries,0,1);
    }

}

$obj = new StrangeClass;
$ex1 = $obj->somethingLikeAMethod("select * from hello");
$ex2 = $obj->somethingLikeAMethod("select * from me");
$ex2 = $obj->somethingLikeAMethod("select * from you");
$ex2 = $obj->somethingLikeAMethod("select * from my_friend");

$ex1->awesomeTest();
$ex2->awesomeTest();
$ex2->awesomeTest();
$ex2->awesomeTest();
$ex2->awesomeTest();
like image 148
Prisoner Avatar answered Aug 25 '26 09:08

Prisoner



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!