Parse error: syntax error, Unexpected '?', expecting Identifier (T_STRING)

Asked

Viewed 1,952 times

0

I can’t find the error in this file, the debug shows me error on line 46, but I can’t find a solution, some light?

<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <[email protected]>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\XPath\Extension;

use Symfony\Component\CssSelector\XPath\Translator;
use Symfony\Component\CssSelector\XPath\XPathExpr;

/**
 * XPath expression translator attribute extension.
 *
 * This component is a port of the Python cssselect library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <[email protected]>
 *
 * @internal
 */
class AttributeMatchingExtension extends AbstractExtension
{
    /**
     * {@inheritdoc}
     */
    public function getAttributeMatchingTranslators()
    {
        return array(
            'exists' => array($this, 'translateExists'),
            '=' => array($this, 'translateEquals'),
            '~=' => array($this, 'translateIncludes'),
            '|=' => array($this, 'translateDashMatch'),
            '^=' => array($this, 'translatePrefixMatch'),
            '$=' => array($this, 'translateSuffixMatch'),
            '*=' => array($this, 'translateSubstringMatch'),
            '!=' => array($this, 'translateDifferent'),
        );
    }

    public function translateExists(XPathExpr $xpath, string $attribute, ?string $value): XPathExpr
    {
        return $xpath->addCondition($attribute);
    }

    public function translateEquals(XPathExpr $xpath, string $attribute, ?string $value): XPathExpr
    {
        return $xpath->addCondition(sprintf('%s = %s', $attribute, Translator::getXpathLiteral($value)));
    }

    public function translateIncludes(XPathExpr $xpath, string $attribute, ?string $value): XPathExpr
    {
        return $xpath->addCondition($value ? sprintf(
            '%1$s and contains(concat(\' \', normalize-space(%1$s), \' \'), %2$s)',
            $attribute,
            Translator::getXpathLiteral(' '.$value.' ')
        ) : '0');
    }

    public function translateDashMatch(XPathExpr $xpath, string $attribute, ?string $value): XPathExpr
    {
        return $xpath->addCondition(sprintf(
            '%1$s and (%1$s = %2$s or starts-with(%1$s, %3$s))',
            $attribute,
            Translator::getXpathLiteral($value),
            Translator::getXpathLiteral($value.'-')
        ));
    }

    public function translatePrefixMatch(XPathExpr $xpath, string $attribute, ?string $value): XPathExpr
    {
        return $xpath->addCondition($value ? sprintf(
            '%1$s and starts-with(%1$s, %2$s)',
            $attribute,
            Translator::getXpathLiteral($value)
        ) : '0');
    }

    public function translateSuffixMatch(XPathExpr $xpath, string $attribute, ?string $value): XPathExpr
    {
        return $xpath->addCondition($value ? sprintf(
            '%1$s and substring(%1$s, string-length(%1$s)-%2$s) = %3$s',
            $attribute,
            strlen($value) - 1,
            Translator::getXpathLiteral($value)
        ) : '0');
    }

    public function translateSubstringMatch(XPathExpr $xpath, string $attribute, ?string $value): XPathExpr
    {
        return $xpath->addCondition($value ? sprintf(
            '%1$s and contains(%1$s, %2$s)',
            $attribute,
            Translator::getXpathLiteral($value)
        ) : '0');
    }

    public function translateDifferent(XPathExpr $xpath, string $attribute, ?string $value): XPathExpr
    {
        return $xpath->addCondition(sprintf(
            $value ? 'not(%1$s) or %1$s != %2$s' : '%s != %s',
            $attribute,
            Translator::getXpathLiteral($value)
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'attribute-matching';
    }
}
  • In the method translateExists removes the query of the parameter $value, and check that the error line changes. I don’t know this parameter pass notation with queries in front of this direct cast.There are more in other methods below.

1 answer

5

TL;DR

  • The mistake nay is in the method translateExists as reported. The problem is that you are using a version of PHP lower than the version 7.1

About the error

Since the version 7.0 of PHP, we can use the methods as follows.

<?php

declare(strict_types=1);

class myClass
{
    public function imprimir(string $msg) : string
    {
        return $msg;
    }
}

$obj = new myClass;
echo $obj->imprimir("Hello World");

That one string $name basically serves to force the developer to pass a variable of type string.

In case you try to pass one null, for example, you will receive the error Fatal error: Uncaught TypeError: Argument 1 passed to myClass::imprimir() must be of the type string, null given.

Demonstration

But many developers ended up having problems when passing an argument of the type null (Often devs didn’t validate before).

This led to the developers of PHP adding the operator ? before the variable type to inform that that method, in addition to receiving the predefined type, may also receive the value of null.

I mean, I broke the version 7.1 you can use the operator ? and inform the parameter as null that you will not receive the above error.

<?php

declare(strict_types=1);

class myClass
{
    public function imprimir(?string $msg) : ?string
    {
        return $msg;
    }
}

$obj = new myClass;
echo $obj->imprimir(null);

Demonstration


Forms of correction

To fix this you have two options: Remove the operator ? of all the files or update your version PHP.

I recommend you use the latest and stable summer of the PHP. In addition to improvements you won’t need to keep removing code every time you use composer update, for example.

Imagine you have to change this into hundreds of files and each new update from the Commodore, having to do the same thing.

  • Thanks @Valdeir, for the clarification, this syntax is very recent, I did not have the knowledge of these innovations. + 1 for the beautiful answer!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.