Hi Daniel,

    "When an object is cloned, PHP 5 will perform a shallow copy of
     all of the object's properties. Any properties that are
     references to other variables, will remain references."

    http://php.net/manual/en/language.oop5.cloning.php

You might have look creating a "clone" in the following manner:

    $clone = unserialize( serialize( $parser ) );

I'm not saying that's the best solution, but it's a quick and dirty solution that sometimes does what you need (namely a deep copy).

Cheers,
Rob.



On 13-06-18 02:17 PM, Daniel Renfro wrote:
Recently I encountered what I thought was a bug in my code, but it turned out 
to be something much more interesting.

First, some background:
Here at Vistaprint we have a number of custom extensions written for our 
internal-documentation wiki. One of those categorizes articles programmatically 
- you call it from the code and it will auto-categorize the page. Something 
along the effect of:
        $c = new Categorizer;
       $c->addToCategory( 'my-message-key' );

Whenever this code was called it broke the Cite extension. Specifically, anything defined with 
<ref></ref>  would not show up in the <references /> section below. Doing some 
digging I found this issue:

1.       Our custom extension parsed a message in the middle of a page (while 
the page was being parsed in the code)

2.       Parsing a message called MessageCache::parse, by way of wfMessage() 
and the Message object

3.       The MessageCache object clones the global parser and parses the message

4.       Parsing the message means that the (cloned) parser calls 
Parser::clearState

The problem is that calling Parser::clearState() on the cloned parser object (a 
property of MessageCache) also clears the state of the global parser object. 
This might be due to two things:

1.       PHP makes shallow-copies of objects when cloning and not deep-copies 
[1].

2.       When the Cite extension inserts itself into a parser it sets up a 
callback to the 'ParserClearState' hook. When this callback is run, because of 
#1 (no deep-copying) it effectively gets run for all clones of the parser.

This is arguably a bug in MediaWiki: cloning a parser does not create a totally 
separate object with its own state. I have found a number of bug-reports that 
seem to be related to this issue [2][3][4]. Before I go off and submit a bunch 
of code, I'd like the input from the community.

Thoughts?
-Daniel       ( User:DanielRenfro )


References:
[1] http://php.net/manual/en/language.oop5.cloning.php
[2] https://bugzilla.wikimedia.org/show_bug.cgi?id=34589
[3] https://bugzilla.wikimedia.org/show_bug.cgi?id=32368
[4] https://bugzilla.wikimedia.org/show_bug.cgi?id=47291

_______________________________________________
MediaWiki-l mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-l


--
E-Mail Disclaimer: Information contained in this message and any
attached documents is considered confidential and legally protected.
This message is intended solely for the addressee(s). Disclosure,
copying, and distribution are prohibited unless authorized.

_______________________________________________
MediaWiki-l mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-l

Reply via email to