I have a question for you!
Normally, if you call a callback function within an OOP context you have to use array(&$this, \'callback_function\')
Say your external class looks like this
<?php
class ExternalClass {
function callback() {
// do something here
}
}
If your callback function makes no reference to $this, you can call it statically like so:
preg_replace_callback($pattern, 'ExternalClass::callback', $subject);
Otherwise, your method should work in theory.
preg_replace_callback($pattern, array(new ExternalClass, 'callback'), $subject);
Read more about callbacks
First a comment:
Normally, if you call a callback function within an OOP context you have to use
array(&$this, 'callback_function')
No, normally (these days) it's array($this, 'callback_function')
- without the &
.
Then, instead of $this
you can put any variable that's representing an object:
$obj = $this;
$callback = array($obj, 'method');
or
class That
{
function method() {...}
}
$obj = new That;
$callback = array($obj, 'method');
This just works, see the documentation of the callback pseudo type in the PHP Manual.
More similar to the code fragments of your question:
class Callback
{
function __construct()
{
$this->list = array("num" => 0, "dot" => 0, "normal" => 0);
$this->td = array("strike" => false, "bold" => false, "italic" => false, "underline" => false, "code" => false);
}
public function callback_heading($parameter)
{
$hashs = min(6, 1+strlen($parameter[1]));
return sprintf("<h%d><span class=\'indented\'>%s</span><strong>%s</strong></h%d>", $hashs, parameter[1], $parameter[2], $hashs);
}
}
class Basic
{
/** @var Callback */
private $cb;
function __construct()
{
// some other vars here
$obj = new Callback();
$this->cb = array($obj, 'callback_heading');
}
function replace($subject)
{
...
$result = preg_replace_callback($pattern, $this->cb, $subject);
}
}
$basic = new Basic;
$string = '123, test.';
$replaced = $basic->replace($string);