String Expression::getClassName(NamePtr name, VariableEnvironment &env) const { String clsname = name->get(env); if (strcasecmp(clsname.data(), "static") == 0) { if (name->getStatic() != clsname) { raise_error("\"static\" cannot be composed by expression in %s:%d", name->loc()->file, name->loc()->line1); } clsname = FrameInjection::GetStaticClassName(NULL); } return clsname; }
NamePtr Parser::procStaticClassName(Token &className, bool text) { NamePtr cname; if (text) { if (className.text() == "self") { cname = Name::fromString(this, peekClass()->name(), true); } else if (className.text() == "parent") { cname = Name::fromString(this, peekClass()->parent(), true); } else { cname = Name::fromString(this, className.text()); } } else { cname = className->name(); if (haveClass() && cname->getStatic()) { if (cname->getStatic() == "self") { cname = Name::fromString(this, peekClass()->name(), true); } else if (cname->getStatic() == "parent") { cname = Name::fromString(this, peekClass()->parent(), true); } } } return cname; }
ExpressionPtr SimpleFunctionCallExpression::make(EXPRESSION_ARGS, NamePtr name, const vector<ExpressionPtr> ¶ms, const Parser &p) { String sname = StringUtil::ToLower(name->getStatic()); if (!sname.isNull()) { if (sname == "get_class" && params.size() == 0) { if (p.currentClass()) { return new ScalarExpression(EXPRESSION_PASS, p.currentClass()->name()); } else { return new ScalarExpression(EXPRESSION_PASS, false); } } else if (sname == "get_parent_class" && params.size() == 0) { if (p.currentClass() && !p.currentClass()->parent().empty()) { return new ScalarExpression(EXPRESSION_PASS, p.currentClass()->parent()); } else { return new ScalarExpression(EXPRESSION_PASS, false); } } } return new SimpleFunctionCallExpression(EXPRESSION_PASS, name, params); }
StaticMethodExpression:: StaticMethodExpression(EXPRESSION_ARGS, const NamePtr &cname, const NamePtr &name, const vector<ExpressionPtr> ¶ms) : SimpleFunctionCallExpression(EXPRESSION_PASS, name, params), m_cname(cname), m_construct(name->getStatic() == "__construct") {}