setTableName('X'); // $query = qsprintf($conn, '%R', $object); // $object->setTableName('Y'); // // We'd like "$query" to reference "X", reflecting the object as it // existed when it was passed to "qsprintf(...)". It's surprising if the // modification to the object after "qsprintf(...)" can affect "$query". $masked_string = xsprintf( 'xsprintf_query', array( 'escaper' => $escaper, 'unmasked' => false, ), $argv); $unmasked_string = xsprintf( 'xsprintf_query', array( 'escaper' => $escaper, 'unmasked' => true, ), $argv); $this->maskedString = $masked_string; $this->unmaskedString = $unmasked_string; } public function __toString() { return $this->getMaskedString(); } public function getUnmaskedString() { return $this->unmaskedString; } public function getMaskedString() { return $this->maskedString; } }