Classes

Syntax and semantics heavily inspired by Kotlin.

Classes in THP are significantly different than PHP.

Definition

A class is defined as follows:

class Animal() {}thp

The name of the class MUST begin with an uppercase letter.

Classes have a parameter list even if they have no parameters for consistency sake.

Instanciation

To create an instance of a class call it as if it was a function, without new.

val animal = Animal()thp

Properties

Properties are declared with var/val inside a block. They must explicitly declare their datatype.

class Person() {
  // This is an error. Properties must declare their datatype,
  // even if the compiler can infer it.
  val name = "Jane Doe"

  // This is correct
  val String name = "Jane Doe"

  // This is also okay
  String name = "Jane Doe"

}thp

Properties are private by default, but can be made public with pub.

class Person() {
  // Properties are private by default
  val String name = "John Doe"

  // To make a property public use `pub`
  pub var Int age = 30

}

val p = Person()
print(p.name) // Compile error: `name` is private
print(p.age) // 30thp

Unlike PHP, to access properties and methods use dot notation . instead of an arrow ->.

Static properties are explained in the Static page.

Readonly properties are explained in the Readonly page.

The interaction between properties and the constructor is explained in the Constructor page.

Methods

Methods are declared with fun, as regular functions.

class Person() {
  fun greet() {
      print("Hello")
  }
}thp

Methods are private by default, and are made public with pub.

class Person() {
  // This method is private
  fun private_greet() {
      print("Hello from private method")
  }

  // Use `pub` to make a method public
  pub fun greet() {
      print("Hello from greet")
  }

}

val p = Person()
p.greet() //: Hello from greet
p.private_greet() // Compile time error. Private method.thp

Unlike PHP, in THP a method cannot have the same name as a property and viceversa. Doing so is a compile error.

class Person() {
  String name = "Rose"

  // This is a compile error
  fun name() -> String {
      "Rose"
  }

}thp

This

THP uses the dollar sign $ as this inside classes. It is required when using a class property/method.

class Person() {
  val String name = "Jane Doe"

  pub fun get_name() -> String {
      return $name
  }

  pub fun greet() {
      val person_name = $get_name()
      print("Hello, I'm {person_name}")
  }

}thp

Mutable methods

By default methods cannot mutate the state of the object.

class Animal(var String name) {
  pub fun set_name(String new_name) {
      $name = new_name    // Error: Cannot mutate $name
  }
}thp

To do so the method must be annotated. The caller must also declare a mutable variable.

class Animal(var String name) {
  pub mut fun set_name(String new_name) {
      $name = new_name    // Ok
  }
}

var michi = Animal("Michifu")
michi.set_name("Garfield")thp