Ще ми обясните ли.....

7 отговора 317 прегледа
#1

Ще ми обясните ли.....

Въпросът ми е не за решението на даден проблем, а по-скоро за разяснение на това решение. Имам клас, който извилча линковете от дадено url:

<?php
/**
* Extract links from a string, from a file or from a valid url

* EXAMPLE:
*
* [ TO PARSE AN URL ( or if you want, a file ) ]
* $myLinks = &new LinkExtractor(); // create a LinkExtractor Object
* if( $myLinks->parseUrl( "[линк]" ) == true ) {
* for( $a = 0, $b = count( $fetchLinks = $myLinks->getLinks() ); $a < $b; $a++ ) {
* echo $fetchLinks[$a]."<br />";
* }
* }
*
*/
class LinkExtractor {

var $linkReg = Array(
"/(?i)<a([^\a]+?)href='([^\a]+?)'/i",
"/(?i)<a([^\a]+?)href=\"([^\a]+?)\"/i",
"/(?i)<a([^\a]+?)href=([^\a]+?)[ |>]/i"
);

function LinkExtractor() {
global $__linkExtractor_linkRecipient;
$__linkExtractor_linkRecipient = Array();
}

function __manageLinkRecipient( $replacement ) {
global $__linkExtractor_linkRecipient;
array_push( $__linkExtractor_linkRecipient, htmlspecialchars( $replacement[2] ) );
}

function __callBackCaller( $st ) {
preg_replace_callback( $this->linkReg, Array( &$this, '__manageLinkRecipient' ),$st );
}

function parseUrl( $url ) {
if( @$fp = fopen( $url, "r" ) ) {
$st = '';
while( $text = fread( $fp, 8192 ) ) {
$st .= $text;
}
fclose( $fp );
$this->__callBackCaller( $st );
return true;
}
return false;
}

function getLinks() {
global $__linkExtractor_linkRecipient;
return $__linkExtractor_linkRecipient;
}
}
?>


Ако може да ми обясните за аргументите на тази функция:
preg_replace_callback( $this->linkReg, Array( &$this, '__manageLinkRecipient' ),$st );

или в частност втория аргумент. Просто ми е напълно неясно с каква цел се подава масив, състоящ се от референция към текущия обект (нали ?) и функция.
Другият въпрос, който имам е защо в доста кодове се използва

foo = &new foo();

Предполагам това връща референция към новосъздадения обект, но не мога да разбера смисъл и каква е разликата като се създаде без &

Мерси много и весели празници !

Отговор
в отговор на Unit-731 #2

Re: Ще ми обясните ли.....

Array( &$this, '__manageLinkRecipient' )
ще рече, че за колбек функция се извиква метода __manageLinkRecipient на обекта ($this) - това по принцип е начина да извикаш юзър-дефайнд функция, която всъщност е метод на обект (използва се не само с preg_replace_callback, ами във всички случаи на извикване на функция/метод, например call_user_func)

Just a genius

Отговор
в отговор на Unit-731 #3

Re: Ще ми обясните ли.....

& се използва за да се избегне копиране на обект.
В PHP всяко присвояване прави копиране по стойност.
Ако се напише
$a = new A
първо се създава обект от клас А и после неговото съдържание се копира в $а.
За да се избегне това копиране се пише
$a = &new A
Така на $a се присвоява референция на новосъздадения обект, а не се прави копие.

Отговор
в отговор на roman #4

Re: Ще ми обясните ли.....

Това означава ли, че ако ми се налага да създам няколко обекта би било грешка да използвам =& при създаването на всеки, защото само ще създам няколко референции към един и същ обект ? Ако правилно съм разбрал това е добре да се използва само за една инстанция ?

Отговор
в отговор на Unit-731 #5

Re: Ще ми обясните ли.....

$a1=new A()
$a2=new A()

$a1!=$a2

$a1=&new A()
$a2=&new A()

$a1===$a2

Moscow, раз-два-три, Moscow, посмотри.
Отговор
в отговор на Bълk #6

Re: Ще ми обясните ли.....

а бе не е баш така :-)

ceco@base ~/tmp
$ cat test.php
<?

class A {}

$a = new A();
$a2 = new A();

var_dump($a === $a2);
var_dump($a == $a2);

$a = & new A();
$a2 = & new A();

var_dump($a === $a2);
var_dump($a == $a2);

echo phpversion();

?>

резултата е

ceco@base ~/tmp
$ php test.php
bool(false)
bool(true)
bool(false)
bool(true)
5.0.3
ceco@base ~/tmp
$ /usr/local/php4/bin/php test.php
bool(true)
bool(true)
bool(true)
bool(true)
4.3.10

т.е. тва което си го написал е вярно само за версия 5 :-)

Отговор
в отговор на phpGuru #7

Re: опа

даже и при 5-та не е така :-) нещо съм се разсеял :-)

Отговор
в отговор на phpGuru #8

Re: опа

В отговор на:

даже и при 5-та не е така :-) нещо съм се разсеял




питаш ли мен след 5-та бира

Moscow, раз-два-три, Moscow, посмотри.
Отговор