|
Тема
|
Ще ми обясните ли.....
|
|
Автор | Unit-731 (Нерегистриран) |
Публикувано | 29.12.04 13:30 |
|
Въпросът ми е не за решението на даден проблем, а по-скоро за разяснение на това решение. Имам клас, който извилча линковете от дадено 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( "http://www.3site.it/index.php" ) == 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();
Предполагам това връща референция към новосъздадения обект, но не мога да разбера смисъл и каква е разликата като се създаде без &
Мерси много и весели празници !
| |
Тема
|
Re: Ще ми обясните ли.....
[re: Unit-731]
|
|
Автор |
Blake (извънземен) |
Публикувано | 29.12.04 15:21 |
|
Array( &$this, '__manageLinkRecipient' )
ще рече, че за колбек функция се извиква метода __manageLinkRecipient на обекта ($this) - това по принцип е начина да извикаш юзър-дефайнд функция, която всъщност е метод на обект (използва се не само с preg_replace_callback, ами във всички случаи на извикване на функция/метод, например call_user_func)
Just a genius
| |
Тема
|
Re: Ще ми обясните ли.....
[re: Unit-731]
|
|
Автор | roman (Нерегистриран) |
Публикувано | 29.12.04 17:45 |
|
& се използва за да се избегне копиране на обект.
В PHP всяко присвояване прави копиране по стойност.
Ако се напише
$a = new A
първо се създава обект от клас А и после неговото съдържание се копира в $а.
За да се избегне това копиране се пише
$a = &new A
Така на $a се присвоява референция на новосъздадения обект, а не се прави копие.
| |
Тема
|
Re: Ще ми обясните ли.....
[re: roman]
|
|
Автор | Unit-731 (Нерегистриран) |
Публикувано | 29.12.04 18:48 |
|
Това означава ли, че ако ми се налага да създам няколко обекта би било грешка да използвам =& при създаването на всеки, защото само ще създам няколко референции към един и същ обект ? Ако правилно съм разбрал това е добре да се използва само за една инстанция ?
| |
Тема
|
Re: Ще ми обясните ли.....
[re: Unit-731]
|
|
Автор |
Bълk (по-нов и по-лош) |
Публикувано | 29.12.04 23:23 |
|
$a1=new A()
$a2=new A()
$a1!=$a2
$a1=&new A()
$a2=&new A()
$a1===$a2
Moscow, раз-два-три, Moscow, посмотри.
| |
Тема
|
Re: Ще ми обясните ли.....
[re: Bълk]
|
|
Автор |
phpGuru (член) |
Публикувано | 30.12.04 00:45 |
|
а бе не е баш така :-)
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 :-)
| |
|
даже и при 5-та не е така :-) нещо съм се разсеял :-)
| |
Тема
|
Re: опа
[re: phpGuru]
|
|
Автор |
Bълk (по-нов и по-лош) |
Публикувано | 30.12.04 07:54 |
|
В отговор на:
даже и при 5-та не е така :-) нещо съм се разсеял
питаш ли мен след 5-та бира 
Moscow, раз-два-три, Moscow, посмотри.
| |
|
|
|
|