Importing Methods from an unrelated Class in PHP5
NOTE: Don’t ever do this. I’m leaving this article up for archival purposes. But with the introduction of traits in PHP 5.4, there is a real, tested way of doing mix-ins that doesn’t rely on what may be considered a bug. See PHP Traits for Implementing Interfaces for more information.
OK, here’s a scenario:
You are developing a Content Management System. You have some information that is available to the public. New information, however, is kept in a sandbox until it is approved by management.You have a class for public information, and a class for private information. You want to use the same method for previewing your sandbox information as you do for formatting your public information.
Solutions:
- Take the easy way out. Copy the method from
public_information
tosandbox_information
. This way has serious disadvantages. You are copying code instead of reusing it. That’s not cool. Also, if you change thepublic_information::format
method, you have to manually update thesandbox_information::preview
method.
<?php
class public_information {
private $info = 'Public';
function format() {
return '<b>'.$this->info.'</b>';
}
}
class sandbox_information {
private $info = 'Sandbox';
function preview() {
return '**'.$this->info.'**';
}
}
$pub = new public_information;
echo $pub->format();
$san = new sandbox_information;
echo $san->preview();
- Use a parent/child relationship. Have an information class and extend it. Take careful note to use protected and not private properties. This is a great solution, but may not be possible.
<?php
class information {
protected $info = '';
function format() {
return '<b>'.$this->info.'</b>';
}
}
class public_information extends information {
protected $info = 'Public';
}
class sandbox_information extends information {
protected $info = 'Sandbox';
function preview() {
return $this->format();
}
}
$pub = new public_information;
echo $pub->format();
$san = new sandbox_information;
echo $san->preview();
- Let’s say you can’t do number 2 because the classes are already children. PHP5 allows you to make a static call to a method of a different class. If you do this inside a method, you can even use $this. But wait, you say, the manual says you can’t make a static method call to a method that uses $this. It turns out that that’s only true if you are doing it when not in object context. When you do it from a class method, you are in object context. (NOTE, this may be considered a BUG. PHP6 will send an ERROR_FAILURE on this when it comes out.)
<?php
class public_classes {}
class sandbox_classes {}
class public_information extends public_classes{
private $info = 'Public';
function format() {
return '<b>'.$this->info.'</b>';
}
}
class sandbox_information extends sandbox_classes {
public $info = 'Sandbox';
function preview() {
return public_information::format();
}
}
$pub = new public_information;
echo $pub->format();
$san = new sandbox_information;
echo $san->preview();
// Fatal error: Using $this when not in object context
// public_information::format();
Slick.
- Related Topics