Industrial
Industrial

Reputation: 42758

PHP: Prevent chained method from returning?

I am having some headaches regarding method chaining for a quite simple PHP class that returns a value, which sometimes need to go through a decryption process:

$dataset = new Datacontainer;
$key = $dataset->get('key');
$key2 = $dataset->get('key')->decrypt();

The get method is where the return lives. So the call to the decrypt method on the second row isn't going to work in its current state.

Can I do something to setup the get method to return only when nothing is chained to it, or what would be the best way to re-factor this code?

Upvotes: 1

Views: 358

Answers (4)

koen
koen

Reputation: 13737

Based on my current understanding of the process I would take the following approach:

An object that decrypts data is providing a service. Such objects are most often passed in

via the constructor as a collaborator:

class ClientClass {
    private $decryptor
    public function __construct(Decryptor $decryptor) {
        $this->decryptor = $decryptor;
    }
    public function doSomethingWith(DataSet $data) {
        $key = $DataSet->getKey();
        // do stuff, decide whether there are encryption needs
        $encryptedKey = $this->decryptor->decrypt($key);
    }
}

Note that there is room for improvement here with the getting of the key from the dataset (then I would need to know more about what is being accomplished, hence the name ClientClass).

Upvotes: 0

Cfreak
Cfreak

Reputation: 19309

$dataset->get('key') has to return an object in which decrypt() is a method. It isn't clear what class your decrypt() method is a part of. If it's a part of your $dataset class then you you need to call it in two lines:

$key2_encrypted = $dataset->get('key');
$key2 = $dataset->decrypt($key2_encrypted);

Upvotes: 0

Mark Baker
Mark Baker

Reputation: 212412

The get() method doesn't actually know whether anything is chained to it or not; but if the get() method returns nothing (null) PHP will complain about the attempt to call the decrypt() method on a non-object.

What you could do is pass an additional argument into the get() method that indicates whether it should return a value, or the object with the decrypt method.

$key = $dataset->get('key');
$key2 = $dataset->get('key',true)->decrypt();

Upvotes: 2

Raffael
Raffael

Reputation: 20045

Can I do something to setup the get method to return only when nothing is chained to it ... ?

No. That's not possible. (Maybe using highly complicated reflection-technology, but that's not practical, if possible at all.)

or what would be the best way to re-factor this code?

I think there is something wrong with the structure of your class. Usually a method that does something but returns the working-instance, changes the state of the class/instance, e.g. through an attribute, that again can be fetched through a special/getter method.

Upvotes: 0

Related Questions