php-general Digest 8 Dec 2010 10:14:56 -0000 Issue 7075

Topics (messages 309896 through 309906):

Re: new keyword combined with other things...
        309896 by: Alexandru Patranescu
        309897 by: Paul M Foster
        309898 by: David Harkness

newbie basic realm protection - why don't the input usr/pass stick?
        309899 by: Govinda
        309905 by: Kranthi Krishna

PHP4 to PHP5 migration with E_STRICT
        309900 by: Tom Robinson
        309901 by: David Harkness
        309903 by: Tom Robinson
        309906 by: Richard Quadling

No errors gets displayed, just a blank page
        309902 by: Rico Secada
        309904 by: Kranthi Krishna

Administrivia:

To subscribe to the digest, e-mail:
        php-general-digest-subscr...@lists.php.net

To unsubscribe from the digest, e-mail:
        php-general-digest-unsubscr...@lists.php.net

To post to the list, e-mail:
        php-gene...@lists.php.net


----------------------------------------------------------------------
--- Begin Message ---
I know how to do it in other ways.
I was just wondering why the simple new Object() -> method won't work. new
operator has precedence over.......
That must be the problem.  -> is not an operator. Is not in this list:
http://php.net/manual/en/language.operators.precedence.php
That must be done. -> should be an operator!

Alex



On Tue, Dec 7, 2010 at 10:49 PM, Jim Lucas <li...@cmsws.com> wrote:

> On 12/7/2010 7:40 AM, Alexandru Patranescu wrote:
> > In many other languages this will work:
> >
> > *$result = new Object() -> method();*
> >
> > But in php, it fails at parsing.
> > I've tried with parenthesis around new but nothing. Anyhow, as I saw
> later,
> > *new* operator has precedence over others so this couldn't be a solution.
> > I know a static function can be defined and the above statement can
> > transform into
> >
> > *$result = Object::getNewInstance() -> method()*
> >
> > but is there any way to write it directly? and if not, why isn't this
> > implemented yet and when will it be?
> >
> > best regards,
> > Patranescu Alexandru
> >
>
>
> Here is what I do if I want to make it a one liner...
>
> <?php
>
> function myNew($obj='stdClass') {
>        return new $obj();
> }
>
> class CustomClass {
>        function PrintString($str='Something')
>        {
>                print($str);
>        }
>        function ReturnString($str='Something')
>        {
>                return $str;
>        }
> }
>
>
> myNew('CustomClass')->PrintString();
>
> echo myNew('CustomClass')->ReturnString('Something Else');
>
> $var = myNew('CustomClass')->ReturnString('And again...');
>
> echo $var;
>
> ?>
>
> I also use the following if I want to use the Singleton method of getting
> my data.
>
> <?php
>
> class myClass {
>        static $_instance;
>        static function run($DefaultValues=null)
>        {
>                if(self::$_instance === null)
>                {
>                        //First and only construction.
>                        self::$_instance = new self($DefaultValues);
>                }
>                return self::$_instance;
>        }
>        function PrintString($str='Default Value')
>        {
>                print $str;
>        }
>        function ReturnString($str='Something')
>        {
>                return $str;
>        }
> }
>
> myClass::run()->PrintString();
>
> echo myClass::run()->ReturnString();
>
> $var = myClass::run()->ReturnString();
>
> echo $var;
>
> ?>
>
> YMMV
>

--- End Message ---
--- Begin Message ---
On Tue, Dec 07, 2010 at 11:01:09PM +0200, Alexandru Patranescu wrote:

> I know how to do it in other ways.
> I was just wondering why the simple new Object() -> method won't work. new
> operator has precedence over.......
> That must be the problem.  -> is not an operator. Is not in this list:
> http://php.net/manual/en/language.operators.precedence.php
> That must be done. -> should be an operator!

I haven't followed this thread closely, but I see code like this in
CodeIgniter a lot. I don't code like this, but it appears that they only
write this kind of code using already instantiated objects. Here is an
example from their user manual:

$this->db->select('title')->from('mytable')->where('id', $id)->limit(10,
20);

What kind of internal magic they use to make this work, I don't know. I
haven't examined their internals.

Paul

-- 
Paul M. Foster

--- End Message ---
--- Begin Message ---
On Tue, Dec 7, 2010 at 1:55 PM, Paul M Foster <pa...@quillandmouse.com>wrote:

> Here is an example from their [CodeIgniter] user manual:
>
> $this->db->select('title')->from('mytable')->where('id', $id)->limit(10,
> 20);
>

This is known as a "fluent interface" because it attempts to make your code
read more naturally--i.e. fluently. Each method returns either a new object
or the same object ($this) so it can flow into the next method call. In the
latter case, the initial object stored in $this->db implements all the above
methods. I first saw this in mock object libraries for Java, but it was
invented years earlier.

    $mock = $this->getMock('Calculator');
    $mock->expect('add')->once()->with(3, 5)->willReturn(8);

David

--- End Message ---
--- Begin Message ---
Hi everyone

I am hacking my way through something unrelated to this post.. but needed to stop and (real quick) pass-protect a page to use it to run some quick (*admin-only*) scripts on a shared host. ..and I see now how poor is my understanding of what seems like basic stuff. As a start for my quick understanding to pass protect a page, I used the "Example #6 Basic HTTP Authentication example", from here:
http://www.php.net/manual/en/features.http-auth.php
..which is just this:

<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Text to send if user hits Cancel button';
    exit;
} else {
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</ p>";
}
?>

..and no matter what i type in the authentication dialogue that pops up.. then after I submit it.. it just keeps looping forever popping up the dialogue.. I.e. I never get past the authenticate dialogue to see this line executed:
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";

What am I missing?

Thanks for your bothering to help with this,

------------
Govinda


--- End Message ---
--- Begin Message ---
you script looks (and works) fine. so i dont think the problem is in your script

I found firebug/live http headers firefox addons to be helpful in this situation
see if your client is actually sending "Authorization   Basic" header

Kranthi.
http://goo.gl/e6t3

--- End Message ---
--- Begin Message ---
Hi,

I'm migrating a web application written for PHP4 to PHP5. I've turned on
E_STRICT to have a detailed look at all the code thoroughly. I have a
number of 'Notices' and 'Strict Standards' messages appearing now.

I don't consider myself a PHP guru by any means so I'm seeking help with
understanding these messages and how to fix the code.

One of the messages is:

"PHP Strict Standards:  Only variables should be assigned by reference in"

This is for a class SPControlPanel with a method

function getContentTypes(&$db)
    {
        $tabledata = array();

        $sql = "select
                    contenttype.*
                from
                    contenttype";

        return $db->queryAll($sql, true);
    }

The warning is for this segment of code below which is another method in
the same class (marked with comment // this line):

function getCategoryTypes(&$db) {
        $tabledata = array();

        $myContentTypes = &SPControlPanel::getContentTypes($db); // this
line
        foreach ($myContentTypes as $key => $data) {
            if ($data['iscategory']) $tabledata[] = $data['contenttype'];
        }

        return $tabledata;
    }

There are many more methods making assignments in a similar way in this
class and in other classes throughout the code.

I'm not sure of the best way to re-code this to resolve the E_STRICT
warning.

Any help is much appreciated.

Regards,

Tom


--- End Message ---
--- Begin Message ---
In getCategoryTypes() you're assigning a reference to the return value of
getContentTypes(), and PHP doesn't like that. You can return a reference to
a variable from a function, but taking the reference of a *value* is
meaningless since you can only create references to variables. Just remove
the & on that marked line to get rid of the warning.

Also, I notice that both of those methods (and I assume many more) take a
reference in $db. Note that all objects are assigned by reference in PHP 5,
and thus the & here is unnecessary since you are passing an object to these
methods and aren't changing the reference inside the method. Note that PHP
won't issue a warning for these since it is acceptable and you might want to
point the reference to a new object inside the function. You aren't doing
that here, so the & is superfluous and misleading.

David

--- End Message ---
--- Begin Message ---
Thanks David.

If my understanding is correct, then:

SPControlPanel::getContentTypes($db);

is a reference to a static instantiation of the class. If so, then it
must be syntactically something like when using 'new' (which returns a
reference) so there's no need to apply the & operator. Am I on the right
track?

I have some more PHP4 code in the application which caused: "PHP
Notice:  Only variable references should be returned by reference". I
have fixed it like this:

<       function & _getTable($cached=true)
<       {
<               return new TableClass($this->_getTableName());
---
>       function & _getTable($cached=true) {
>               $temp = new TableClass($this->_getTableName());
>               return $temp;

Is this acceptable?

I'll have to come back to the $db issue - it's not issuing a warning so
I'll leave it alone until I've tidied up all the other issues.

Regards,

Tom

--- End Message ---
--- Begin Message ---
On 8 December 2010 01:12, Tom Robinson <tom.robin...@motec.com.au> wrote:
> Thanks David.
>
> If my understanding is correct, then:
>
> SPControlPanel::getContentTypes($db);
>
> is a reference to a static instantiation of the class. If so, then it
> must be syntactically something like when using 'new' (which returns a
> reference) so there's no need to apply the & operator. Am I on the right
> track?
>
> I have some more PHP4 code in the application which caused: "PHP
> Notice:  Only variable references should be returned by reference". I
> have fixed it like this:
>
> <       function & _getTable($cached=true)
> <       {
> <               return new TableClass($this->_getTableName());
> ---
>>       function & _getTable($cached=true) {
>>               $temp = new TableClass($this->_getTableName());
>>               return $temp;
>
> Is this acceptable?
>
> I'll have to come back to the $db issue - it's not issuing a warning so
> I'll leave it alone until I've tidied up all the other issues.
>
> Regards,
>
> Tom

I'd go with ...

function _getTable($cached=true) {
  return new TableClass($this->_getTableName());
}



-- 
Richard Quadling
Twitter : EE : Zend
@RQuadling : e-e.com/M_248814.html : bit.ly/9O8vFY

--- End Message ---
--- Begin Message ---
Hi.

What can cause that no parse error gets displayed (blank page/no output
at all) even though error reporting is set to "-1"? 

I have run the script through php lint on the console and it comes up
with no errors.

I have run into this problem the last couple of days making debugging a
nightmare.

Anyone with experience in this behavior?

Thanks and best regards

Rico

--- End Message ---
--- Begin Message ---
wats the setting of display_errors php.net/display_errors ?

if you are not getting any output it might be because of a simple
parse error (mismatched brackets, misplaced semicolon etc) or an
exit/die command

Kranthi.
http://goo.gl/e6t3

--- End Message ---

Reply via email to